【问题标题】:Access member variables after destructor call析构函数调用后访问成员变量
【发布时间】:2015-03-30 17:26:43
【问题描述】:

我有这样的代码:

class Foo {
  public:
    void blub () {}
};
class Test {
  public:
  Foo& foo;
  Test (Foo& f) : foo (f) {}
  void test () {
    this->~Test ();
    foo.blub ();
  }
};

显式调用析构函数后,我的Test类的所有成员变量可能都无法访问,所以调用foo.blub()无效。如果我将引用存储在局部变量中以避免访问成员变量,那么对 foo.blub() 的调用是否保证有效?编译器不能在析构函数调用后优化局部变量并访问成员变量,使其再次失效吗?

class Foo {
  public:
    void blub () {}
};
class Test {
  public:
  Foo& foo;
  Test (Foo& f) : foo (f) {}
  void test () {
    Foo& f = foo;
    this->~Test ();
    f.blub ();
  }
};

【问题讨论】:

  • 绑定到f 的对象与问题无关。 f 本身的评估,实际上是 this->f,是无效的,因为在您结束 *this 的生命周期后,this 不是有效的 Test 指针。
  • f不是 this->ff本地test()
  • 顺便说一句:你最好不要永远在堆栈上分配Test的对象调用test(),否则会繁荣!
  • 确实如此。我的实例将通过在 char 数组上放置 new 进行分配。

标签: c++ explicit-destructor-call


【解决方案1】:

您的本地 f 指的是 Test 之外的对象,并且只要 test() 存在,f 就会持续存在,所以是的,它会起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-14
    • 2020-02-16
    • 1970-01-01
    • 2019-09-03
    • 2015-08-04
    • 1970-01-01
    相关资源
    最近更新 更多