1
8
不,这就是 static-initialization fiasco . 未指定对象在进入main之前的构造顺序。唯一的保证就是它会发生。 您可以做的是惰性初始化。这意味着您的对象在使用之前不会被初始化。例如:
你用
第一次创建B时会发生什么?(全局或在函数中)构造函数将调用
注意,我想我把你的A和B颠倒了。 |
2
1
一般来说,没有这种方法。不过,还有一些解决办法。通过拥有一个全局指针并在main/winmain中初始化/销毁它,您可以得到一个具有全局作用域且生存期略短于全局的对象。此外,还可以将全局状态放在引用计数堆对象的最后一个要销毁的位置。 另外,考虑重新设计:) |
3
1
书 "Modern C++ Design" 很好地解决了这个问题。 谷歌图书包含了大部分内容的扫描——见第6.5节(第135页) link . |
4
1
您可以通过在全局空间中放置指向对象的指针来清晰地处理这个问题, 然后在你的主中按所需的顺序更新它们,在主的末尾按所需的顺序销毁它们。 |
5
0
正如其他人指出的,由于 Static initialization order fiasco 问题。 但是,您应该能够通过应用一点设计来解决您的问题,因此您可以在构建A和B的对象(以及如何构建)时获得一定程度的控制。看看设计模式,比如创意模式 Singleton 在许多情况下(如果不是大多数情况下),它被认为是 anti-pattern 尽管值得学习。也要看看 Monostate 可以作为一个更好的单件使用的模式。这些模式有助于控制对象的创建和生存期,因此在使用之前,可以对事物进行适当的初始化。 一般来说,避免全球变暖是个好主意——坚持 deglobalisation 是个好主意。 |
6
0
如果您使用懒惰的单例(返回按需创建的静态信息),那么可能会导致一个单例在删除后使用另一个单例。例如,假设您有一个全局
同样
Sample code 以下内容:
输出为:
到目前为止,一切都是正确的,只是因为它发生了
如您所见,日志在其析构函数之后被使用
现在,不管这些单体的建造顺序如何,破坏令将确保
|
TheKing · 为什么数组的地址可以有负值? 2 年前 |
yurnero · MATLAB:“加载”一个快速访问功能 6 年前 |
joe · 一页可以同时在两个工作集中吗? 6 年前 |
Jaques · “.exe”已触发断点 6 年前 |
adn bps · 在函数中修改变量的高效内存方法 6 年前 |
Gauraang Khurana · C语言中分段错误的不稳定行为 6 年前 |
Rajesh K · 如何查找设备中存在的广告垃圾? 6 年前 |