一例析构顺序造成的错误

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值