这一个星期以来,一个莫名其妙的bug一直困扰着我,让我寝食难安。。
上面这段代码是用在message里面,创建一个entry。看起来如此简单的一段代码,却会在析构中产生异常。我把析构函数清空还是会产生一样的问题,会panic掉。
开始以为是没有用symbian的CleanupStack的原因,但假设了很多种情况,都不对。刚才灵感一来,想会不会是delete顺序的原因,于是将析构的代码改成下面这样,问题就解决了。
所以猜测原因是先删除了iSession之后,iSession内容为空,而在iEntry的析构中对iSession进行了操作,导致panic。
现在发现是这种小问题导致我迷惑了一个星期,真冤!!!
在这里总结一些析构或删除对象时应注意的问题:
- class test
- {
- private:
- CMsvEntry *iEntry;
- CMsvSession* iSession;
- S3DummyObserver* iObserver;
- public:
- test()
- {
- iObserver = new S3DummyObserver;
- iSession = CMsvSession::OpenSyncL(*iObserver);
- iEntry = CMsvEntry::NewL(*iSession, KMsvRootIndexEntryId, TMsvSelectionOrdering(KMsvNoGrouping,EMsvSortByNone,ETrue));
- }
- ~test()
- {
- delete iSession;
- delete iEntry; // 异常
- delete iObserver;
- }
- };
开始以为是没有用symbian的CleanupStack的原因,但假设了很多种情况,都不对。刚才灵感一来,想会不会是delete顺序的原因,于是将析构的代码改成下面这样,问题就解决了。
- ~test()
- {
- delete iEntry; // 正常
- delete iSession;
- delete iObserver;
- }
现在发现是这种小问题导致我迷惑了一个星期,真冤!!!
在这里总结一些析构或删除对象时应注意的问题:
- 注意删除顺序,最好以栈方式申请和删除。
- 如果删除出错,则考虑对象的析构函数是不是private型的。
- 如果是用CleanupStack,则应参考 Inside CBase class - six essential questions