2010-08-03 41 views
3

对不起我inattension,总之~CSArray()是工作,但接口和实现类有不同的文件,因此错误是在这里析构函数永远不会被调用

+1

确定保留/释放计数是否匹配? – Lothar 2010-08-03 09:59:21

+0

保留计数实际上是否达到零?是否调用了'CSObject'的析构函数? CSObject的析构函数是虚拟的吗? ' – 2010-08-03 10:13:45

+0

来自调试器, '保留计数是否实际达到零?是 '是否调用了CSObject的析构函数?'是 'CSObject的析构函数是虚拟的吗?'是 CSArray的析构函数未被调用 – Ariel 2010-08-03 10:22:44

回答

4

请确保您在声明的析构函数virtual基类。

+0

' virtual',CSObject destuctor only only invoked, – Ariel 2010-08-03 10:01:31

+0

@Ariel:你可以发布使用这种方法的代码吗? – Naveen 2010-08-03 10:02:22

2

显示的代码目前太短而无法看到问题。

一些很好的建议:永远不要建立自己的引用计数方案。使用经过验证的库实现,如std :: auto_ptr,boost :: shared_ptr或boost :: shared_array,并利用RAII(http://en.wikipedia.org/wiki/RAII)。 另外,请避免像鼠疫一样“删除这个”。它在某些情况下似乎有效,但通常前/后条件太多。

+0

在尝试引用计数之前研究'delete this'的条件是个好主意,但引用计数既不复杂也不困难,正如大量COM组件所证明的那样,所有这些组件都实现'IUnknown'。另外,您建议的类不是线程安全的,因此“重用库版本”可能会造成很大的麻烦。 – 2010-08-03 12:07:34

+0

@Ben:而且OP的代码是线程安全的?另见http://stackoverflow.com/questions/692438/is-boost-shared-ptr-xxx-thread-safe – UncleBens 2010-08-03 16:15:10

+0

马库斯,我喜欢可可风格,所以我让他们 – Ariel 2010-08-03 18:07:33

2

假设_retainCount = 0

它的工作原理,只要你有你的声明在基类的析构函数virtual

请参见下面的代码:(gcc版本3.4.3)

#include<iostream> 
using namespace std; 

class A 
{ 
    public: 
     A(){cout<<"A ctor"<<endl;}; 
     virtual ~A(){cout<<"A dtor"<<endl;}; 
     void testDel() 
     { 
      delete this; 
     } 
}; 

class B: public A 
{ 
    public: 
     B(){cout<<"B ctor"<<endl;}; 
     ~B(){cout<<"B dtor"<<endl;}; 
}; 

int main() 
{ 
    B bObj; 

    bObj.testDel(); 
    return 0; 
} 

结果:W/O明确删除

A ctor 
B ctor 
B dtor 
A dtor 

结果:与明确的删除

A ctor 
B ctor 
B dtor 
A dtor 
B dtor 
A dtor 
+0

我不太清楚你的意思通过“完美的作品”;删除一个自动变量会导致一个未定义的行为,并且很可能会崩溃,导致您获得双重破坏。 – 2010-08-03 12:16:10

+0

@Mike Seymour我只是为了证明析构函数被调用。那么我应该删除单词“完美”:) ...我在这里没有考虑UB ... – KedarX 2010-08-03 12:28:50

相关问题