我想重置一个对象.我可以通过以下方式进行吗?
anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();
Run Code Online (Sandbox Code Playgroud)
此代码显然是在placement new中分配的对象的典型生命周期的子集:
AnObject* anObject = malloc(sizeof(AnObject));
anObject = new (anObject) AnObject(); // My step 2.
// ...
anObject->~AnObject(); // My step 1.
free(anObject)
// EDIT: The fact I used malloc instead of new doesn't carry any meaning
Run Code Online (Sandbox Code Playgroud)
唯一改变的是构造函数和析构函数调用的顺序.
那么,为什么在以下常见问题解答中 出现所有威胁呢?
[11.9]但是如果我用new分配了我的对象,我可以显式调用析构函数吗?
常见问题解答:除非对象分配了新的展示位置,否则您不能.必须删除new创建的对象,它会做两件事(记住它们):调用析构函数,然后释放内存.
FQA:翻译:删除是一种明确调用析构函数的方法,但它也会释放内存.您也可以在不释放内存的情况下调用析构函数.在大多数情况下它很丑陋而且无用,但你可以做到这一点.
析构函数/构造函数调用显然是普通的C++代码.代码中使用的保证直接来自放置新保证.它是标准的核心,它坚如磐石.它怎么称为"脏"并被表现为不可靠的东西?
您是否认为新的插入式和非插入式实施是不同的?我正在考虑一些病态的可能性,例如,常规的新的可以放置在块之前分配的内存块的大小,其中放置新的显然不会这样做(因为它不分配任何内存).这可能会导致某些问题出现间隙...... 这样的新()实现是否可行?
我读过这篇文章关于使用placement new来重置a boost::shared_ptr同时避免额外的内存分配,并假设可以为a做同样的,如果不相似的话std::unique_ptr?我的问题是当std::unique_ptr类型是什么时Base*可以指向任何类型,如果类的大小不同,那么工作是否Derived*会placement new按预期Derived进行?这样的事情可能是:
class Base
{
public:
Base() {}
virtual ~Base(){}
};
class Foo : public Base
{
public:
Foo() : Base() {}
virtual ~Foo(){}
int a;
int b;
};
class Bar : public Base
{
public:
Bar() : Base() {}
virtual ~Bar() {}
int a;
};
int main()
{
std::unique_ptr<Base> bp(new Bar());
bp->~Base(); //edit: call destructor
void* rawP = dynamic_cast<void*>(bp.release());//edit: cast to void* …Run Code Online (Sandbox Code Playgroud)