我想重置一个对象。我可以通过以下方式进行吗?
anObject->~AnObject();
anObject = new(anObject) AnObject();
// edit: this is not allowed: anObject->AnObject();
这段代码显然是由 inplace 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
唯一改变的是构造函数和析构函数调用的顺序。
那么,为什么在下面的常见问题解答 中出现了所有的威胁?
[11.9] 但是,如果我用 new 分配了我的对象,我可以显式调用析构函数吗?
常见问题解答:您不能,除非该对象是使用新位置分配的。new 创建的对象必须被删除,它做了两件事(记住它们):调用析构函数,然后释放内存。
FQA:翻译:delete 是一种显式调用析构函数的方法,但它也会释放内存。您也可以在不释放内存的情况下调用析构函数。在大多数情况下它是丑陋和无用的,但你可以这样做。
析构函数/构造函数调用显然是普通的 C++ 代码。代码中使用的保证直接来自放置新的保证。它是标准的核心,坚如磐石。怎么能被称为“肮脏”并被呈现为不可靠的东西?
您认为 new 的就地实施和非就地实施有可能不同吗?我正在考虑一些病态的可能性,例如常规 new 可以将分配的内存块的大小放在块之前,而就地 new 显然不会这样做(因为它不分配任何内存)。这可能会导致一些问题的空白......这样的 new() 实现可能吗?