成员顺序,派生顺序
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比代码中使用的要小。我今天也有这个麻烦。我定义bool mMyArray[6];
然而,在我的代码中,我在某处使用mMyArray[7]=false;
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 在派生函数中指定void*参数
- 如何通过派生类函数更改基类中的向量
- 数到第n个楼梯的路(顺序无关紧要)
- 如何委托派生类使用其父构造函数?
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- 如何使用单独文件中的派生类访问友元函数对象
- 派生类销毁的最佳实践是什么
- 如何使用基类指针引用派生类成员
- 在派生类中指定基类的C++顺序
- 派生类中的初始化顺序
- C++:派生类对象的最终完成顺序
- 成员顺序,派生顺序