C++ 手动调用基类析构函数和新放置
在销毁使用placement new运算符构造的对象时,在基类指针上调用基类析构函数是否安全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() {
#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()