成员顺序,派生顺序

Order of members, order of derivation matters?

本文关键字:顺序 派生 成员      更新时间:2023-10-16

有时我会遇到这样的问题,即每当我在C++类中更改成员的顺序和派生顺序时,问题就会得到解决,崩溃就会得到修复。

最近,我将一个私有成员变量的位置从较低的位置移到了类的顶部,错误得到了修复

还有一次我上了a级:公共B,公共C。当我把这个改成类A:公共C,公共B崩溃代码开始工作。C是包含虚拟方法的类在前一种情况下,类A在C中找不到被覆盖的方法,但在后来的情况下,它能够找到。这是由于虚拟指针损坏造成的吗?如果是,这与秩序有什么关系成员?我知道当我们更改成员的顺序时,内存布局会发生变化,但我们如何调试此类问题,因为在VS2008中,我找不到任何关于崩溃发生原因的指示?

注意:基类B和C是完全独立的,彼此之间没有依赖关系。

基类和成员对象是按声明顺序初始化的,而不是按初始化器列表的顺序初始化的。

如果其中一个基接收到指向另一个基对象的指针,并且只存储指针以供以后在其构造函数中使用,那么ctor将访问尚未构造的对象。

在MSVC/VS下使用/W3警告级别时,当this传递给指向对象尚未初始化的部分的基ctor时,以及当初始值设定项列表被打乱以匹配声明顺序时,都应该发出警告。

可能性:

  • 您没有重新编译所有源代码,所以您的标头不同步
  • 你有一些史诗未定义的行为在某个地方毁掉了一切

调试步骤:

  • 运行静态分析工具
  • 在调试模式下完全重建
  • 通过调试器运行
  • 运行动态分析工具

可能是您定义了一个数组:int A[M]。M比代码中使用的要小。我今天也有这个麻烦。我定义bool mMyArray[6];

然而,在我的代码中,我在某处使用mMyArray[7]=false;