讨论继承类内存释放问题
假设一个基类
class base{
public:
~base();
int id;
};
base::~base()
{
printf("~base\n")
}
另一个类从基类继承
class sub1:public base{
public:
~sub1();
int fd;
}
sub1::~sub1()
{
printf("~sub1\n")
}
main()
{
sub1* c1=new sub1();
base* b1=(base*)c1;
c1->id=10;
c1->fd=100;
delete b1;
}
运行结束,屏幕打印:~base
说明子类sub1的析构函数没有执行,此时会不会造成内存泄露?
我在linux用valgrind工具检测,并没有报内存泄露错误,求解!
[解决办法]
1个new对应1个delete,但lz你的代码问题在于,new的对象和delete的对象不是一个,类型也不同,delete的是base类的指针,当然调用的base的方法。
现在没看到内存泄漏不代表你用法没问题,类的结构复杂的话,比如sub1里又new过东西,那就会看到内存泄漏了
[解决办法]
内存泄露是成员里含有指针变量,需要析构函数释放时,才会泄露~~你这个是基本类型,不会~~
[解决办法]
会,你的基类析构函数不是虚的,自然是会存在泄漏
[解决办法]
楼主,不要花时间在错误的问题上讨论正确解。
[解决办法]
class base{
public:
~base();
int id;
};
base::~base()
{
printf("~base\n");
};
class sub1:public base{
public:
sub1()
{
p = new int[10000];
}
~sub1();
int fd;
int *p;};
sub1::~sub1()
{
printf("~sub1\n");
delete []p;};
int _tmain(int argc, _TCHAR* argv[])
{
sub1* c1=new sub1();
base* b1=(base*)c1;
c1->id=10;
c1->fd=100;
delete b1;
return 0;
}
再试试
[解决办法]
我认为会泄露
c1 在堆上 并且没有析构 在程序退出前是泄露的
[解决办法]
要么设Base的析构函数为虚函数,要么就不要通过base的指针来delete。否则,行为未定义(也就是错误)。这里重复4楼。