C++ 当我从std::vector中的新位置调用析构函数时会发生什么?
如果我有以下几点C++ 当我从std::vector中的新位置调用析构函数时会发生什么?,c++,vector,destructor,C++,Vector,Destructor,如果我有以下几点 #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
#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;
}
#包括
C类
{
公众:
C()
:
m_d(新国际)
{
*m_d=2;
}
~C()
{
删除m_d;
}
国际货币基金组织;
};
int main()
{
std::矢量数据;
数据。调整大小(sizeof(C));
C*newC=new(&data[0])C;
C*cAgain=重新解释铸件(和数据[0]);
cAgain->~C();
返回0;
}
到底发生了什么?当std::vector被销毁时,它是否释放了内存两次?如果没有,为什么没有?如果有,您将如何防止它?您已将数据声明为char的vector,因此vector对象在char的数据类型上工作,而不是在类C上,因此当它被销毁时,不会调用析构函数,因为char没有析构函数 因此,只有一个析构函数被称为~C()
std::vector data
处理自己的内存,该内存包含char
,与C
无关
C*newC=new(&data[0])C代码>调用C
,(分配)的构造函数
当newC
离开作用域时,不会调用C
的析构函数。(newC
只是一个指针,而不是C
)
cAgain->~C()代码>调用C
的析构函数(良好)。对于newC
,当作用域结束时,不会调用C
的(额外)析构函数
因此,假设对齐正确,并且newC
和cAgain
之间的混叠正确,您的代码没有泄漏。C没有重新检查3/5/0规则(幸运的是,没有复制发生)。您的新位置可能存在对齐问题。我认为,cAgain
需要。除了它应该是正常的以外。@Jarod42默认分配器与std::max_align_t
@Jared42您能解释一下std::launder
的必要性吗?@neomeracana:See.我有什么理由不在上面的newC
和cAgain
之间假设别名吗?