Fir*_*cer 4 c++ destructor memory-management global-variables
我有一个类(A)在其构造函数和析构函数中访问(间接通过静态方法)另一个类(B)中的静态变量(STL容器).
对象可以是全局的,全局常量,另一个类的静态成员,存储在其他类(可能本身具有全局或静态实例)中,或者基本上可以是c ++对象的任何其他位置.
如果A对象在B中的静态成员之前构造或在B中的静态成员之后被破坏,则会在某些时候导致崩溃(通常是访问冲突).
有没有一些方法,以保证(除了那些已经泄漏,因为按照定义,"迷失"等不会被破坏任何方式)A类的所有实例构造之后和在B的静态变量破坏?
我已经看到了一些解决方案,用于使特定变量在另一个之前/之后被构造/销毁,但是不是给定类型的所有实例的一般情况,因此我不确定如何处理它.
不.这称为静态初始化惨败.在输入main之前构造对象的顺序是未指定的.唯一的保证就是它发生了.
你可以做的是懒惰初始化.这意味着在您使用它们之前不会初始化您的对象.如:
struct A { /* some data */ };
struct B { B(void){ /* get A's data */ } };
A& get_A(void)
{
static A instance;
return instance;
}
B& get_B(void)
{
static B instance;
return instance;
}
Run Code Online (Sandbox Code Playgroud)
您使用get_A和get_B获取全局实例.其中部分B用途A应该使用get_A,以及您的使用B应符合get_B.请注意,get_B在您的情况下是可选的.
B首次创建时会发生什么?(全局或函数中)构造函数将调用,get_A并且将在何处A创建.这让你控制事物的构造顺序.
注意我想我颠倒了你的A和B.
| 归档时间: |
|
| 查看次数: |
4497 次 |
| 最近记录: |