给定两个类,只有原始数据类型,没有自定义析构函数/释放分配器。C++规范是否保证它将以正确的大小释放?
struct A { int foo; };
struct B: public A { int bar[100000]; };
A *a = (A*)new B;
delete a;我想知道我是否需要编写一个空的virtual dtor?
我已经尝试过g++和vc++2008,它们不会造成泄漏。但是我想知道C++标准中什么是正确的。
发布于 2010-01-20 18:39:49
除非基类析构函数是虚的,否则它是未定义的行为。参见5.3.5/4:
如果delete运算符的操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,并且静态类型应具有虚拟析构函数或行为未定义。
发布于 2010-01-20 18:35:37
根据C++标准,你拥有的是未定义的行为--这可能会表现为泄漏,也可能不会,为了让你的代码正确,你需要一个虚拟析构函数。
此外,您不需要该(A*)强制转换。每当您发现自己在C++中使用C风格的强制转换时,您都可以相当确定它是不必要的,或者您的代码是错误的。
发布于 2010-01-20 18:37:32
这是一种未定义的行为--也许一切都很好,也许是哪里出了问题。要么不这么做,要么给基类提供一个虚拟析构函数。
在大多数实现中,这是不会泄漏的--类中没有堆分配的成员函数,所以当delete完成时,唯一需要做的就是释放内存。释放内存只使用对象的地址,没有更多的东西,堆完成了所有的工作。
https://stackoverflow.com/questions/2100644
复制相似问题