虽然我知道这可能不是最好的想法,但我会假设:
调用对象是否合法(即定义的行为) 手动析构函数,然后将内存重用于另一个对象?
说明:
class A {
int a, b, c;
A() {}
~A() {}
}
A createObject() {
A object;
return object;
}
代码:
A* object = new A();
// Use object...
object->~A();
*object = createObject();
答案 0 :(得分:6)
您不能像正在执行的那样在被破坏的对象上调用赋值运算符。至少一般情况下,虽然它可能适用于某些类型。你能做的就是:
A* object = new A();
object->~A();
// Placement new.
// Constructs a new object in the memory pointed to by object pointer.
// Doesn't allocate memory.
new (object) A(createObject());
您甚至可以使用placement new在该内存中构造不同类型的对象,只要它们适合。只需确定两件事:
delete
,直到你在其位置重新构造一个对象(相同类型)。答案 1 :(得分:3)
明确调用析构函数是合法的事情 - 实际上,这就是您使用展示位置new
时所执行的操作。在已经分配内存时,“就地”初始化对象也是合法的事情,但是你应该采用不同的方式:不是使用赋值运算符,你可以使用这种语法:
object = new (object) A(); // Placement syntax
你这样做(使用赋值运算符)是不正确的,因为你在析构函数已经完成的对象上调用了一个函数(即赋值运算符)。