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

sha*_*oth 9 c++ pointers destructor object-lifetime

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

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调用代码中的指针变量变为无效.然后在同一位置创建新对象.

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

eca*_*mur 8

这在3.8:7中得到明确批准:

3.8对象寿命[basic.life]

7 - 如果在对象的生命周期结束后,在原始对象占用的存储位置创建了一个新对象,则可以使用指向原始对象的指针.操作新对象,如果:( 在这种情况下满足的各种要求)

给出的例子是:

struct C {
  int i;
  void f();
  const C& operator=( const C& );
};
const C& C::operator=( const C& other) {
  if ( this != &other ) {
    this->~C(); // lifetime of *this ends
    new (this) C(other); // new object of type C created
    f(); // well-defined
  }
  return *this;
}
Run Code Online (Sandbox Code Playgroud)

  • 可能最繁重的各种要求是对象不能有任何`const`或引用数据成员(也不能有它的成员,因为当你把这个技巧应用到一个对象时,你对它的所有应用都是同样的技巧成员及其成员等).这样的数据成员可能是导致某人思考的主要原因,"我不能改变对象,所以我需要销毁并重新创建它",但它们是错的. (2认同)
  • 因此很容易为非异常安全的自我分配检查赋值操作符进行downvote ...但后来我读到它是标准中的例子.-1到标准. (2认同)