这样会内存泄漏吗?欢迎讨论

ccnuxjg 2003-11-26 06:00:01
用一个基类指针创建一个派生类对象(派生类比基类大),然后再删除这个基类指针的操作会造成内存泄漏吗。

Sample Code:

#include "iostream.h"

class CBase
{
public:
~CBase(){cout<<"quit base...."<<endl;};
int i;
int j;
};

class CChildClass : public CBase
{
public:
~CChildClass(){cout<<"quit child...."<<endl;};
float f;
};

int main(int argc, char* argv[])
{
CBase *p = NULL;
p = new CChildClass;

p->i = sizeof(CBase);
p->j = sizeof(CChildClass);
((CChildClass*)p)->f = 0.0001;

delete p; //会造成内存泄漏吗?

printf("Hello World!\n");
return 0;
}
...全文
45 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
jeckyz 2003-11-26
  • 打赏
  • 举报
回复
不会泄露,虽然基类释构函数没初调用,但不会影响资源的释放,不过好习惯应该这样修改一下:

class CBase
{
public:
virtual ~CBase(){cout<<"quit base...."<<endl;};
^^^^^^^
int i;
int j;
};

本来不是抽象类就不该继承的。
zjxiaoyu 2003-11-26
  • 打赏
  • 举报
回复
很同意abitz(阿奈)。
tianyxy 2003-11-26
  • 打赏
  • 举报
回复
1、基类析构函数为虚时,系统编译时进行动态绑定,就是说如果在自类中被也有析构,则子类析构时调用子类的析构函数 而不掉用父类的析构
hjf1010 2003-11-26
  • 打赏
  • 举报
回复
各位大虾:
如果仅仅考虑上面的程序,不管析构函数怎么定义的都不会产生内存泄漏,因为基类和派生类中的变量会在对象析构时自动释放。
但如果是用new操作符申请的堆内存则不一样,它要由delete 操作符释放,否则造成内存泄漏。
上面的程序析构函数定义不合理,如果对象中有堆内存,将会造成内存泄漏。不知道我的解释是否合理,请打下指教。
abitz 2003-11-26
  • 打赏
  • 举报
回复
to laomai(老迈):
请看《Inside the C++ Object Model>
laomai 2003-11-26
  • 打赏
  • 举报
回复
借这个帖子请教一下一些早就困惑的问题:
1、为什么基类的析构函数改成虚的以后,它就可以调子类的析构函数呢?
2、用基类指针指向一个子类对象时,编译器到底是如何处理的?(我想这个问题要是解释清楚了,第一个问题可能也跟着解决了)
请高手指教!多谢!
abitz 2003-11-26
  • 打赏
  • 举报
回复
不会造成内存泄漏。new operator 进行两部分工作:
1。调用operator new 分配内存
2。调用ctor在分配好的内存上构造对象。
在operator new 分配内存时,会进行簿记工作,纪录所分配之内存的大小。
delete operator 也进行两部分工作:
1。调用dtor析构对象
2。调用operator delete 释放内存。
operator delete会依据operator new 分配内存时所纪录之信息将内存释放掉,显然,分配了多少,将释放多少。
你的问题只是没有调用派生类的dtor,在当前的情况下不会产生memory leak.但如果派生类有自己的动态内存需要在析构时释放,那么将产生memory leak。
ccnuxjg 2003-11-26
  • 打赏
  • 举报
回复
是啊,我也觉得有内存泄漏。
但是很纳闷,VC和BoundsChecker都查不出来有内存泄漏。

我也知道要不析构函数改成虚拟的。但是那个类(严格来说,是结构)是别人维护的。
ccnuxjg 2003-11-26
  • 打赏
  • 举报
回复
谢谢楼上的。
不过上面例子不是基类的析构没有调用,而是派生类的析构没有调用。
noirchloe 2003-11-26
  • 打赏
  • 举报
回复
会,析构函数,不是虚的
oopig 2003-11-26
  • 打赏
  • 举报
回复
会有内存泄漏。
CBase加上一个虚拟析构函数就没有内存泄漏了。
NoneSoVile 2003-11-26
  • 打赏
  • 举报
回复
不会,不过鸡类的析构函数没有被调用
还是用虚析构函数吧
ccnuxjg 2003-11-26
  • 打赏
  • 举报
回复
我注意了,基类大小是8,派生类是12,
基类指针创建了大小为12的类对象,而指针删除时,派生类的析构函数没有调用,是不是说只释放了大小为8的空间呢?

如果将
delete p;改为
delete (CChildClass*)p;
则派生类的析构函数会被调用。

是不是应该用
delete (CChildClass*)p;来删除指针呢?

(但是我用工具查不到上面程序有什么内存泄漏啊)
ntxs 2003-11-26
  • 打赏
  • 举报
回复
不知道

但一定会产生 空悬指针 因为P的指向将是不确定的 。

所以因为加一句

P = NULL;

64,646

社区成员

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

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