手动模拟C++中删除操作符的效果是否正式违法?

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,但我有兴趣知道.

Ben*_*igt 3

我很确定这不符合标准。标准(据我所知)中没有任何地方说 的 操作数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)