相关疑难解决方法(0)

是否允许显式调用析构函数,然后在具有固定生存期的变量上放置new?

我知道显式调用析构函数会因为双析构函数调用而导致未定义的行为,如下所示:

#include <vector>

int main() {
  std::vector<int> foo(10);
  foo.~vector<int>();
  return 0;  // Oops, destructor will be called again on return, double-free.
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我们将新位置称为"复活"对象,该怎么办?

#include <vector>

int main() {
  std::vector<int> foo(10);
  foo.~vector<int>();
  new (&foo) std::vector<int>(5);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

更正式的:

  1. 如果我在某个对象上显式调用析构函数而不是首先使用placement new构造,那么C++中会发生什么(我对C++ 03和C++ 11都感兴趣,如果存在差异)(例如它是本地/全局变量还是被分配了new)然后,在该对象被破坏之前,在其上调用placement new以"恢复"它?
  2. 如果没关系,是否保证对该对象的所有非const引用也都可以,只要我在对象"死"时不使用它们?
  3. 如果是这样,是否可以使用非const引用中的一个用于放置new以恢复对象?
  4. const引用怎么样?

示例用例(虽然这个问题更多是关于好奇心):我想"重新分配"一个没有的对象operator=.

我已经看到这个问题,说"覆盖"具有非静态const成员的对象是非法的.所以,让我们将这个问题的范围限制在没有任何const成员的对象上.

c++ lifetime placement-new c++11 explicit-destructor-call

20
推荐指数
2
解决办法
960
查看次数

销毁和重新创建对象会使指向此对象的所有指针无效吗?

这是这个问题的后续行动.假设我有这个代码:

class Class {
    public virtual method()
    {
        this->~Class();
        new( this ) Class();
    }
};

Class* object = new Class();
object->method();
delete object;
Run Code Online (Sandbox Code Playgroud)

这是这个答案所暗示的简化版本.

现在,一旦从method()对象生命周期内调用析构函数结束,并且object调用代码中的指针变量变为无效.然后在同一位置创建新对象.

这是否使指向调用对象的指针再次有效?

c++ pointers destructor object-lifetime

9
推荐指数
1
解决办法
474
查看次数