这是一个比较低级的错误, 用C++模拟C#提供接口, 声明了纯虚函数, 看起来像这样:

1
2
3
4
5
class ITestable
{
public:
virtual void Test() = 0;
};

这个接口看起来OK, 用起来也OK, 但是问题是拿到实例化后的对象通过接口形式的指针释放的时候, 没有调用到实际对象的析构函数, 像这样:

1
2
ITestable *test = new TestCase();
delete test;

执行上面的语句, TestCase对象的析构函数未被调用到. 问题原因很简单, 就是c++虚析构的问题, 只不过声明接口的时候, 为了美观忘了接口也是个类, 没有添加虚析构函数. 修复后的代码如下:

1
2
3
4
5
6
class ITestable
{
public:
virtual ~ITestable() {}
virtual void Test() = 0;
};