如果我有以下内容
#include <vector>
class C
{
public:
C()
:
m_d(new int)
{
*m_d = 2;
}
~C()
{
delete m_d;
}
int* m_d;
};
int main()
{
std::vector<char> data;
data.resize(sizeof(C));
C* newC = new(&data[0]) C;
C* cAgain = reinterpret_cast<C*>(&data[0]);
cAgain->~C();
return 0;
}
究竟发生了什么?当std::vector<char>
被销毁时,它是否释放了两次内存?如果没有,为什么没有呢?如果有,您将如何预防?
您已将数据声明为char的向量,所以该向量对象对char的数据类型起作用,而不是对您的C类,因此,销毁该对象时将不会调用析构函数,因为char没有一个。
所以只有一个析构函数称为〜C()
[std::vector<char> data;
处理自己的包含char
的内存,与C
无关。
C* newC = new(&data[0]) C;
的调用构造函数,(分配)。
[C
离开作用域时,不调用newC
的析构函数。 (C
只是一个指针,而不是newC
)
C
的呼叫析构函数(良好)。至于cAgain->~C();
,当作用域结束时,不会调用C
的(额外)析构函数。
因此假定正确的对齐方式以及newC
和C
之间的别名正确,您的代码没有泄漏。