当base没有虚拟析构函数时,清空子类 - 删除基指针的不利影响?

时间:2014-04-11 16:57:59

标签: c++ inheritance heap

this question跟进,我想知道:

class MyVector : public std::vector<int> {};

std::vector<int>* obj = new MyVector;
delete obj;

这有任何副作用吗?

2 个答案:

答案 0 :(得分:2)

通过标准的字母,您可以调用未定义的行为,因此任何事情都可能发生。但我想在大多数正常实现中,MyVector的析构函数实际上是一个无操作(当然,除了调用std::vector的析构函数之外),所以你在实践中是安全的。

另一个问题是为什么你首先动态地分配一个矢量(类似的类)。我说这是一个相当不寻常的场景。如果你真的需要动态分配,你可以考虑强制std::shared_ptr中的所有权(或者使用类型删除的删除器推出你自己的智能指针),它能够在构造时修复正确的析构函数(感谢@CantChooseUsernames提出的建议。)

答案 1 :(得分:1)

即使该类为空,它仍然会分配一些东西(至少1个字节)..

https://ideone.com/CpNlNG

#include <iostream>
#include <vector>


void* operator new(std::size_t count)
{
    std::cout<<"Allocated: "<<count<<" bytes\n";
    return malloc(count);
}

class MyVector : public std::vector<int> {};

class Empty {};

int main()
{
    std::vector<int>* obj = new MyVector;
    delete obj;

    Empty* empty = new Empty;
    delete empty;

    return 0;
}

结果:

Allocated: 12 bytes
Allocated: 1 bytes

即使使用O3也是如此。如果你不使用空类,它当然会得到优化。