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
之间假设别名吗?