Stu*_*etz 5 c++ language-lawyer
我意识到这是不明智的,我不打算这样做,但我很好奇以下是否真的是非法的:
#include <iostream>
struct X
{
~X()
{
std::cout << "~X()\n";
}
};
int main()
{
X *x = new X;
//delete x;
x->~X();
::operator delete(x);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我的理解,delete x;相当于调用析构函数然后调用::operator delete(x);,但根据标准手动执行此操作是否合法?我知道这在使用placement new时是有效的,但是在非展示位置呢?我的预感是它可能是非法的,因为delete(而不是operator delete)必须为每个人执行new,但我有兴趣知道.
我很确定这不符合标准。标准(据我所知)中没有任何地方说 的 操作数delete p;直接传递给释放函数,并且delete []几乎可以肯定它不会原封不动地传递。
然而,它可能适用于所有实际实现。
当然,您不应该显式调用全局释放函数。在您的示例中这很好,它没有用户定义的分配和释放函数,但在一般情况下则不然(实际上,是否有任何语法用于调用特定于类的释放函数(如果存在),否则调用全局释放函数? )。
另外,一般情况下,传递给释放函数的指针肯定不是delete的操作数。考虑:
struct A
{
virtual ~A() {}
};
struct B1 : virtual A {};
struct B2 : virtual A {};
struct B3 : virtual A {};
struct D : virtual B1, virtual B2, virtual B3 {};
struct E : virtual B1, virtual D {};
int main( void )
{
B3* p = new D();
p->~B3(); // should be ok, calling virtually
operator delete(p); // definitely NOT OK
return 0;
}
Run Code Online (Sandbox Code Playgroud)