一例析构顺序造成的错误

原创 2006年05月24日 09:48:00
类中成员变量定义的顺序会有什么影响?
应该是没有,平时谁会去注意下面代码中m_xxx, m_yyy的先后次序呢?

class CXxx;
class CYyy;

class CZzz;
{
    ...
private:
    CXxx m_xxx;
    CYyy m_yyy;
}

其实是有区别的,就是定义顺序造成析构顺序不同。

本例就是实际DEBUG过程中发现的析构顺序造成的错误。(VC环境)

代码中m_yyy的析构早于m_xxx(与构造顺序相反),
若m_xxx保存了m_yyy的一个指针m_pY, 并在析构过程中引用该指针就会有意外。

CXxxx::~CXxxx()
{
    m_pY->MethodOfYyy();
}

m_pY所指向的对象已经析构,虽然调用一般不会报错,但结果错误的。
m_yyy析构以后的简单成员变量会保持原值,但如std::string这样的复杂变量已清空。

解决方法:
改变定义顺序虽可消除错误,其实应该改变流程,使析构顺序与行为无关。
如不要在析构方法中引用可能已无效的指针,可改为显示调用。

Debug心得:
实际代码远非如此简单,指针的传递层次较多。现象为一个string无故变空。
不知道如何设置断点,所有赋值语句都禁掉还是自动变化。
VC的数据断点也不灵。
在错误无法定位时,首先要设法使错误容易复现。
通过缩小测试数据的规模,只保留使错误重现的最小数据集,然后再跟踪调试。
测试数据缩小后,仅跟踪执行了几次就发现变量改变的点在析构函数上。

记录一个析构顺序错误导致程序中断的问题

记录一个析构顺序错误导致程序中断的问题在vs2013中运行以下代码(需要引入boost库),当程序结束时会出现中断将Init()函数中的service变量声明移到main()中sockPtr声明之前,...

构造析构顺序.rar

  • 2008年10月21日 19:35
  • 329KB
  • 下载

C++中派生类的构造、析构的调用顺序

派生类中构造与析构的调用顺序

全局对象和全局静态、局部静态析构顺序

多久不用C++ ,好多東西都模糊了,最近跟人討論全局和靜態的析構順序,之前總覺得這個根據編譯器來決定的,其實還是有一定的說法的。 記錄一下:1. 全局与静态对象析构的顺序class A destru...

揭示C++中全局类变量的构造与析构顺序

在完成《专业嵌入式软件开发 — 全面走向高质高效编程》一书后,我将下一本书的创作集点放在了基于C++的面象对象设计与开发上。从现在开始我将陆续推出关于C++和面高对象设计的博文。下面我们切入主题。 ...

包含对象成员的类的构造与析构顺序

构造函数的执行顺序: (1)存在继承关系时,先执行父类的构造函数,再执行子类的构造函数; (2)当一个类中含有对象成员时,在启动本类的构造函数之前,先分配对象空间,按对象成员的声明顺序执行他们各自的构...
  • pfd001
  • pfd001
  • 2016年03月25日 04:00
  • 777

奇妙的(继承类对象)构造与析构顺序调用

//=================================================构造函数=============================================...

C++中子类继承父类构造器和析构器的执行顺序

当子类继承父类时,实例化子类对象,构造函数的执行顺序是从父类的构造函数到子类的构造函数依次往下,接下来继续执行main函数,在main函数的最后一句执行完毕时,开始执行析构函数,顺序是从子类到父类依次...

c++构造、析构顺序

在创建class a的一个对象的时候,拿new运算符来说,他总是会先去请求一块该对象期望大小的内存,然后调用class a的构造函数并传入所申请内存的地址作为this指针完成构造。 如果class ...
  • abelx
  • abelx
  • 2015年03月29日 10:59
  • 299

C++ 构造,析构顺序(静态对象)

C++ 构造,析构顺序(静态对象)
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一例析构顺序造成的错误
举报原因:
原因补充:

(最多只允许输入30个字)