(在线等,项目期,火速度回答!)关于基类、派生类对象的动态分配问题

renxu350 2010-11-13 01:19:18

class Base{
protected:
int B;
}

class Derived: public Base{
protected:
int D;
}

void main()
{
Base *pB = new Derived;
delete pB;
}


请看上面的代码,
问题是会不会出现内存泄露?要给出另人信服的理由!
...全文
107 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
gules 2010-11-13
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 qq120848369 的回复:]
gules想的太深太多了,惯性思维了.

我说的是正确的,析构 不等于 内存释放. 这里可以不析构,但是内存既然是new里malloc出来的,就必须释放,否则是永远占用的,gules只是把内存和析构想错了.
[/Quote]

对你,我不加理会,只回答楼主的问题。
gules 2010-11-13
  • 打赏
  • 举报
回复
所谓trivial(平凡的,无用的),是指该析构函数对于类来说不是必须的,没有实际做事情;
所谓non-trivial(非平凡的,有用的),是指该析构函数的功能对于类来说是必须的,做了影响实际程序逻辑的事情(如析构函数中需要释放某些资源等)。
qq120848369 2010-11-13
  • 打赏
  • 举报
回复
gules想的太深太多了,惯性思维了.

我说的是正确的,析构 不等于 内存释放. 这里可以不析构,但是内存既然是new里malloc出来的,就必须释放,否则是永远占用的,gules只是把内存和析构想错了.
黑娃 2010-11-13
  • 打赏
  • 举报
回复
比如你的类A中有个成员是指针p,构造时new了一下,把p指向他;这时你的类就是non-trivial,你需要在析构的时候delete p,不然就会使得p指向的内存泄露。
renxu350 2010-11-13
  • 打赏
  • 举报
回复
说反了,
gules,falcomavin 说不泄露,
qq120848369 说泄露?
复杂啊!
renxu350 2010-11-13
  • 打赏
  • 举报
回复
gules,falcomavin 说泄露,
qq120848369 说不泄露?
复杂啊!
qq120848369 2010-11-13
  • 打赏
  • 举报
回复
我认为既然你在堆上分配了派生类,而只删除了基类,那么派生类的部分始终占用,这个没什么问题,别人肯定用不了,这就是泄漏.

楼上几位说的,应该是针对我们手动管理内存复用时候才不算泄漏,这里一定是泄漏了,没啥可说的,只是说没必要析构,不代表没必要释放内存.
renxu350 2010-11-13
  • 打赏
  • 举报
回复
谢谢楼上2位!能不能把 non-trivial,trivail 解释一下?谢谢!
黑娃 2010-11-13
  • 打赏
  • 举报
回复
pB虽然是基类指针,但此时指向的是派生类,所有pB所指向的内存的那段长度,此时也等于派生类所占据的大小,所以delete pB的时候仍然是把所分配的内存释放完全了的。

指针指向基类或派生类,不同的只是所指内存的长度,起始点都一致,你不用忧虑delete时不能正确判断指针指向的长度。
renxu350 2010-11-13
  • 打赏
  • 举报
回复
谢谢楼上回答,能不能把 non-trivial,trivail 解释一下?谢谢!
gules 2010-11-13
  • 打赏
  • 举报
回复
这个问题关键在于派生类的析构函数是否为non-trivial(非平凡的),如果是,那么基类的析构函数应该为虚(派生类析构才能得以运行)!

现在你这里的代码中,派生类的析构函数是trivail的,因此执不执行没有影响。
renxu350 2010-11-13
  • 打赏
  • 举报
回复

Base *pB = new Derived;
/*
中间有N多的 pB-> 操作
*/
delete pB;


派生类有一个增加的成员,
虽然 pBase 指向的是派生类对象,
但 delete 的 pB 却是基类指针,pB 类型也是基类指针,
请问会不会内存泄露?
renxu350 2010-11-13
  • 打赏
  • 举报
回复

Base *pB = new Derived;
/*
中间会有很多的代码
*/
delete pB;

renxu350 2010-11-13
  • 打赏
  • 举报
回复
非常感谢楼上的回答,

但我有个问题,
派生类有一个增加的成员,
虽然 pBase 指向的是派生类对象,
但 delete 的 pB 却是基类指针,pB 类型也是基类指针,

我主要担心的是这个问题!希望各位详细解答!
黑娃 2010-11-13
  • 打赏
  • 举报
回复
不会,new之后马上delete,程序没有第二种路线可走。

内存泄露一般是这样发生的,new之后执行大片其他代码之后才delete,看似严谨,却暗藏漏洞,比如在new和delete之间可能跑出了异常,可能提前返回return,从而使得大片代码之后的delete执行不到,形成内存泄露。
gules 2010-11-13
  • 打赏
  • 举报
回复
就目前情况,不会!
renxu350 2010-11-13
  • 打赏
  • 举报
回复
请来人帮忙回答。。。

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧