局部变量引用其他局部变量是危险的吗?

Set*_*gie 2 c++ destructor reference

以这两个类为例:

struct Owned {
    Owned() : i() { }

    void print() { cout << ++i << endl; }

    int i;
};

struct Owner {
    Owner(Owned& o) : o(o) { }

    Owned& o;

    ~Owner() { o.print(); }
};
Run Code Online (Sandbox Code Playgroud)

以这种方式使用它们是危险的吗?

int main() {
    Owned owned;
    Owner owner(owned);
}
Run Code Online (Sandbox Code Playgroud)

似乎,根据它们被破坏的顺序,这可能导致析构owner函数在被破坏的函数上调用函数owned.是否定义了局部变量的破坏顺序,以及如何使两个实例相互引用的情况?

请原谅我,如果这是常识,我在任何地方都没有读过任何关于它的信息.

Xeo*_*Xeo 5

局部变量以与创建的相反顺序销毁.在你的情况下,你没事,因为owner以前总会被摧毁owned.

§6.6 [stmt.jump] p2

在从范围退出(但是已完成)时,在该范围内构造的具有自动存储持续时间(3.7.3)的对象将按其构造的相反顺序销毁.

但是,如果您可以在施工后重新分配拥有的成员,则必须小心.

你怎么能让两个实例相互引用的情况呢?

不要让它们在析构函数中相互访问.或者首先要弄清楚究竟是谁被摧毁,也许是通过回调或标志传递.例:

struct two;
struct one{
  two* other;

  one(two* o = nullptr) : other(o) {}
  ~one(){ if(other) other.other = nullptr; }
};

struct two{
  one* other;
  two(one* o = nullptr) : other(o) {}
  ~one(){ if(other) other.other = nullptr; } 
};
Run Code Online (Sandbox Code Playgroud)

这将确保两个对象永远不会引用不存在的对象.

无论如何,相互引用对象非常罕见.