繁体   English   中英

成员顺序,派生顺序有关系吗?

[英]Order of members, order of derivation matters?

有时我碰到过这个问题,每当我更改成员的顺序,C ++类中的派生顺序时,问题都会得到解决,崩溃会得到解决。

最近,我将私有成员变量的位置从班级的较低位置移到了班级顶部,并且错误已得到解决。

还有一次我有A类:公共B,公共C。当我将其更改为A类:公共C,公共B时,崩溃代码开始起作用。 C是包含虚拟方法的类,在前一种情况下,类A找不到C中重写的方法,但在后来的情况下,它可以找到。 这是由于虚拟指针损坏吗? 如果是这样,那与会员顺序有什么关系? 我知道更改成员顺序时内存布局会发生变化,但是我们如何调试此类问题,因为在VS2008中我找不到任何有关崩溃发生原因的指示?

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

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

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

在MSVC / VS下使用/W3警告级别,应在this其传递到指向尚未初始化的对象的一部分的基本ctor以及将初始值设定项列表改组以匹配声明顺序时发出警告。

可能性:

  • 您没有重新编译所有源代码,因此标头不同步。
  • 您在某个地方毁灭了所有史诗般的未定义行为。

调试步骤:

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

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

但是,在我的代码中,我在某处使用了mMyArray [7] = false;。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM