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.是否定义了局部变量的破坏顺序,以及如何使两个实例相互引用的情况?
请原谅我,如果这是常识,我在任何地方都没有读过任何关于它的信息.
局部变量以与创建的相反顺序销毁.在你的情况下,你没事,因为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)
这将确保两个对象永远不会引用不存在的对象.
无论如何,相互引用对象非常罕见.
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |