从this question跟进,我想知道:
class MyVector : public std::vector<int> {};
std::vector<int>* obj = new MyVector;
delete obj;
这有任何副作用吗?
答案 0 :(得分:2)
通过标准的字母,您可以调用未定义的行为,因此任何事情都可能发生。但我想在大多数正常实现中,MyVector
的析构函数实际上是一个无操作(当然,除了调用std::vector
的析构函数之外),所以你在实践中是安全的。
另一个问题是为什么你首先动态地分配一个矢量(类似的类)。我说这是一个相当不寻常的场景。如果你真的需要动态分配,你可以考虑强制std::shared_ptr
中的所有权(或者使用类型删除的删除器推出你自己的智能指针),它能够在构造时修复正确的析构函数(感谢@CantChooseUsernames提出的建议。)
答案 1 :(得分:1)
即使该类为空,它仍然会分配一些东西(至少1个字节)..
#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也是如此。如果你不使用空类,它当然会得到优化。