C++ 手动调用基类析构函数和新放置

C++ 手动调用基类析构函数和新放置,c++,destructor,new-operator,C++,Destructor,New Operator,在销毁使用placement new运算符构造的对象时,在基类指针上调用基类析构函数是否安全 #include <iostream> class ABase { public: virtual ~ABase() { std::cout << "~ABase()" << std::endl; } }; class A : public ABase { public: ~A() {

在销毁使用placement new运算符构造的对象时,在基类指针上调用基类析构函数是否安全

#include <iostream>

class ABase
{
    public:
    virtual ~ABase()
    {
        std::cout << "~ABase()" << std::endl;
    }
};

class A : public ABase
{
    public:
    ~A()
    {
        std::cout << "~A()" << std::endl;
    }
};

int main()
{
    ABase* a = new (malloc(sizeof(A))) A();
    a->~ABase();
    free(a);
    return 0;
}

我在ideone.com上的例子:

为什么它不“安全”?你是如何定义“安全”的?如果不安全的话,这种语言就会被打破。(如果您编写
ABase*a=new a;delete a;
,或多或少会发生这种情况)看起来像是正确使用了新位置。有一天你可以替换
a->~ABase()或自己编写该函数,这样就不需要重复该类型。我怀疑你能否得到这个问题的有用答案。“看起来不错。”并不是一个答案,引用所有的标准条款来证明这是合法的需要大量的工作。这主要是因为~ABase()是虚拟的,将调用基类析构函数。有人可能会找到这方面的标准条款
~A()
~ABase()