kcw*_*cwu 18 c++ memory-leaks memory-management
给定两个类只有原始数据类型,没有自定义析构函数/解除分配器.C++规范是否保证它将以正确的大小解除分配?
struct A { int foo; };
struct B: public A { int bar[100000]; };
A *a = (A*)new B;
delete a;
Run Code Online (Sandbox Code Playgroud)
我想知道我需要写一个空的virtualdtor吗?
我试过g ++和vc ++ 2008,它们不会导致泄漏.但我想知道C++标准中的正确性.
Jam*_*kin 24
除非基类析构函数是虚拟的,否则它是未定义的行为.见5.3.5/4:
如果[删除运算符]的操作数的静态类型与其动态类型不同,则静态类型应为操作数的动态类型的基类,静态类型应具有虚拟析构函数或行为未定义.
小智 16
根据C++标准,你所拥有的是未定义的行为 - 这可能表现为泄漏,它可能不会,为了使你的代码正确,你需要一个虚拟的析构函数.
此外,您不需要(A*)演员.每当你发现自己在C++中使用C风格的强制转换时,你可以相当确定它是不必要的,或者你的代码是错误的.
| 归档时间: |
|
| 查看次数: |
2471 次 |
| 最近记录: |