auto obj = new Object;
obj->~Object();
delete obj;
我知道这不太寻常,但它是否是定义行为?它会导致任何意外的问题吗?
auto obj = new Object;
obj->~Object();
delete obj;
我知道这不太寻常,但它是否是定义行为?它会导致任何意外的问题吗?
只有在您用以下方式替换obj
指向的被破坏的对象时,才能这样做:如果:
auto obj = new Object;
obj->~Object();
new (obj) Object();
delete obj;
operator delete(obj)
,但在存在类特定的 operator delete
的情况下,它将失败。当delete
表达式调用operator delete (...)
时,标准要求首先检查类特定重载。但是当您在代码中显式调用operator delete
时,这种情况不会发生。 - WhiZTiM如果导致一个对象的析构函数被调用两次,那么这是未定义行为。您没有遵循规则,编译器可以随意处理您的代码。只要不要这样做。
如果我们严格按照标准语言来看,你的代码会导致未定义行为并引起问题。
然而,如果使用以下代码,我会非常惊讶如果任何平台遇到任何问题:
struct Foo {};
void testFoo()
{
Foo* foo = new Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
foo->~Foo();
delete foo;
}
struct Bar {std::string s;};
void testBar()
{
Bar* bar = new Bar{"test"};
bar->~Bar();
delete bar;
}