Pra*_*bhu 6 c++ destructor visual-c++ bounds-checker
几个小时后,我正在摆弄一个内存泄漏问题,事实证明我真的有一些关于虚拟析构函数的基本内容错了!让我来解释一下我的班级设计.
class Base
{
virtual push_elements()
{}
};
class Derived:public Base
{
vector<int> x;
public:
void push_elements(){
for(int i=0;i <5;i++)
x.push_back(i);
}
};
void main()
{
Base* b = new Derived();
b->push_elements();
delete b;
}
Run Code Online (Sandbox Code Playgroud)
边界检查器工具报告派生类向量中的内存泄漏.我发现析构函数不是虚拟的,并且不会调用派生类析构函数.当我将析构函数虚拟化时,令人惊讶地得到了解决.即使未调用派生类析构函数,也不会自动释放向量吗?这是BoundsChecker工具中的怪癖还是我对虚拟析构函数的理解错误?
Nic*_*yer 15
当基类没有虚析构函数时,通过基类指针删除派生类对象会导致未定义的行为.
您所观察到的(对象的派生类部分永远不会被破坏,因此其成员永远不会被解除分配)可能是许多可能行为中最常见的,并且是确保您的析构函数是至关重要的一个很好的例子.当你以这种方式使用多态时虚拟.
小智 8
如果基类没有虚析构函数,那么代码的结果是未定义的行为,不一定是被调用的错误析构函数.这可能是BoundsChecker正在诊断的内容.