析构或删除对象时应该注意的问题

    这一个星期以来,一个莫名其妙的bug一直困扰着我,让我寝食难安。。
  1. class test
  2. {
  3. private:
  4.     CMsvEntry *iEntry;
  5.     CMsvSession* iSession;
  6.     S3DummyObserver* iObserver;

  7. public:
  8.     test()
  9.     {
  10.         iObserver = new S3DummyObserver;
  11.         iSession = CMsvSession::OpenSyncL(*iObserver);
  12.         iEntry = CMsvEntry::NewL(*iSession, KMsvRootIndexEntryId, TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone,ETrue));
  13.     }
  14.     ~test()
  15.     {
  16.         delete iSession;
  17.         delete iEntry;          // 异常            
  18.         delete iObserver;
  19.     }

  20. };
上面这段代码是用在message里面,创建一个entry。看起来如此简单的一段代码,却会在析构中产生异常。我把析构函数清空还是会产生一样的问题,会panic掉。
开始以为是没有用symbian的CleanupStack的原因,但假设了很多种情况,都不对。刚才灵感一来,想会不会是delete顺序的原因,于是将析构的代码改成下面这样,问题就解决了。
  1. ~test()
  2. {
  3.      delete iEntry;     // 正常
  4.      delete iSession;       
  5.      delete iObserver;
  6. }
所以猜测原因是先删除了iSession之后,iSession内容为空,而在iEntry的析构中对iSession进行了操作,导致panic。
现在发现是这种小问题导致我迷惑了一个星期,真冤!!!

在这里总结一些析构或删除对象时应注意的问题:
  1. 注意删除顺序,最好以栈方式申请和删除。
  2. 如果删除出错,则考虑对象的析构函数是不是private型的。
  3. 如果是用CleanupStack,则应参考 Inside CBase class - six essential questions
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值