一例析构顺序造成的错误

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1055019次
    • 积分:15000
    • 等级:
    • 排名:第751名
    • 原创:375篇
    • 转载:49篇
    • 译文:19篇
    • 评论:394条
    文章分类
    文章存档
    最新评论