gpt4 book ai didi

c++ - 在 C++ 中手动模拟 delete 运算符的效果是否正式非法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:12:58 26 4
gpt4 key购买 nike

我意识到这是不明智的,我不打算这样做,但我很好奇以下行为是否实际上在形式上是非法的:

#include <iostream>

struct X
{
~X()
{
std::cout << "~X()\n";
}
};

int main()
{
X *x = new X;
//delete x;
x->~X();
::operator delete(x);
return 0;
}

我的理解是delete x;相当于调用析构函数然后调用::operator delete(x);,但是我这样做合法吗那手动按标准?我知道这对使用 placement new 是有效的,但是在非 placement 情况下呢?我的预感是它可能是非法的,因为必须为每个 new 执行 delete(而不是 operator delete),但我会有兴趣确定。

最佳答案

我很确定这不符合标准。标准(据我所知)中没有任何地方说 delete p; 的操作数直接传递给释放函数,对于 delete [] 来说几乎可以肯定不会原封不动地通过。

但是,它可能适用于所有实际实现。

当然,您不应该显式调用全局释放函数。在您的示例中很好,它没有用户定义的分配和释放函数,但在一般情况下没有(实际上,是否有任何语法可以调用特定于类的释放函数(如果存在),否则调用全局释放函数? ).

另外,一般情况下,传递给deallocation函数的指针肯定不是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;
}

关于c++ - 在 C++ 中手动模拟 delete 运算符的效果是否正式非法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4422294/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com