最近在做一个iOS应用,我们C++开发组发布了一个图形库,之前用Xcode9.2发布过,一切正常。之后Xcode升级到了9.3,修改了一些bug后,又重新发布了一版,结果一运行就闪退。看到这个结果立马心里一惊,心想也没改什么东西,只改了一些无关痛痒的地方,而且在其他的平台都发布过也没有什么问题啊,我觉得应该是Xcode升级所致,但升都升了,想降也不容易,只好硬着头皮调试,发现程序总是在一处析构函数调用的地方提示:
我一看这也不是什么错误,这不是断点嘛,但我也没有打断点,想继续向下调试,却始终卡在这个地方,仔细检查了一下对象,也没有发现问题,之后经过一番周折,终于发现的问题的根源:原来那个对象会产生内存泄漏,其实就是
class Base
{
public:
Base() {}
~Base() {}
//...
};
class Derive : public Base
{
public:
Derive() {}
~Derive() {}
//...
};
Base* f()
{
//...
return new Derive();
}
void g()
{
auto p = f();
//...
delete p;
}
基类的析构函数不是虚函数,结果在程序中直接delete基类对象指针,该指针所指向的对象实际是派生类对象,因此会产生内存泄漏,升级到Xcode9.3之后,居然连这样的问题也在运行时报错了,真是应该庆幸啊! 虽然错误提示很奇怪,不过找到了问题的原因,还是很开心,内存泄漏无处不在!程序员要小心啊!