C++析构函数的内存泄露

来源:百度知道 编辑:UC知道 时间:2024/06/10 06:32:09
class tree
{
protected:
int *p;
public:
tree();
~tree();
};
tree::tree()
{
p = new int;
}
tree::~tree()
{
delete p;
}
这段代码会不会造成内存泄露问题? 为什么呢?谢谢各位了。急需回答,谢谢、

这是我在另一版面回答的,好像也是你提的问题吧..!!!!

这段代码有内存泄露的危险,因为C++标准明确指出,当子类对象经由基类指针删除时,倘若基类带有一个non-virtual(非虚)析构函数,此时其结果为undefined(未定义).这在C++中最后变为了一个通用的程序设计方法:既对一个有可能做为基类的类,其析构函数最好声明为virtual的,这可以保证在使用多态的情况下,通过基类指针正确删除子类对象. 分析如下:

考虑从tree类继承,下面是子类代码:

class child:public tree
{
private:
char *pc;
public:
child()
{
pc=new char[100]; //这里假设此操作不为抛出任何异常
}
~child()
{
delete[] pc;
}
};

tree *pt=new child(); //通过基类指针引用子类对象
delete pt; //此时只是删除刚刚构建的子类对象中的基类成分
//而子类的析构函数可能根本不会调用,从而使子类
// 的资源发生泄露

但若将tree类的析构函数加上virtual,则C++会保证在以上的情况下准确调用child的析构函数来释放资源.注意,我的child类析构函数并没有声明为virtual的,因为这里假设其作为tree的子类,而虚拟是有继承性的,当tree析构函数为virtual时,child析构函数自动变为virtual......

应该不会,,,
delete p;
p = NULL;

5楼高见,确实会有他说的问题,如果有可能作为基类,,析构函数还是加上virtual好

不会造成内存泄露

因为