gpt4 book ai didi

c++ - 局部变量引用其他局部变量是否危险?

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:30 24 4
gpt4 key购买 nike

以这两个类为例:

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

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

int i;
};

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

Owned& o;

~Owner() { o.print(); }
};

这样使用它们有危险吗?

int main() {
Owned owned;
Owner owner(owned);
}

看起来,根据它们被销毁的顺序,这可能会导致 owner 的析构函数调用被销毁的 owner 上的函数。是否定义了局部变量的销毁顺序,如何使两个实例相互引用的情况起作用?

如果这是常识,请原谅我,不过我还没有在任何地方读到任何相关内容。

最佳答案

局部变量的销毁顺序与创建顺序相反。在你的情况下,你很好,因为 owner 总是会在 owned 之前被销毁。

§6.6 [stmt.jump] p2

On exit from a scope (however accomplished), objects with automatic storage duration (3.7.3) that have been constructed in that scope are destroyed in the reverse order of their construction.

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

how can you make a situation where two instances refer to each other work?

不要让它们在析构函数中相互访问。或者弄清楚谁先被销毁,也许有一个回调或传递的标志。示例:

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; }
};

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

无论如何,相互引用的对象是非常罕见的。

关于c++ - 局部变量引用其他局部变量是否危险?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9827376/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com