【发布时间】:2017-12-21 20:43:36
【问题描述】:
在下面的 C++ 代码中,我可以显式调用析构函数,但不能显式调用构造函数。这是为什么?在 dtor 的情况下,不是更明确的 ctor 调用 expressive 和 unified 吗?
class X { };
int main() {
X* x = (X*)::operator new(sizeof(X));
new (x) X; // option #1: OK
x->X(); // option #2: ERROR
x->~X();
::operator delete(x);
}
【问题讨论】:
-
看起来你正在调用一个未初始化对象的成员函数,即 UB。
-
'new (x) X' 是什么意思?为什么会编译?它应该是“新的 X(x)”吗?
-
@patatahooligan:有关详细信息,请参阅新展示位置。它只是构造对象,即不分配内存。
-
@Ron:它分配
sizeof(X)字节的内存,返回的指向空的指针只是转换为指向X的指针。 -
你可以认为placement-new是一个显式的构造函数调用
标签: c++ constructor destructor placement-new explicit-destructor-call