`
luliangok
  • 浏览: 781172 次
文章分类
社区版块
存档分类
最新评论

一例析构顺序造成的错误

 
阅读更多
类中成员变量定义的顺序会有什么影响?
应该是没有,平时谁会去注意下面代码中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的数据断点也不灵。
在错误无法定位时,首先要设法使错误容易复现。
通过缩小测试数据的规模,只保留使错误重现的最小数据集,然后再跟踪调试。
测试数据缩小后,仅跟踪执行了几次就发现变量改变的点在析构函数上。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics