代码:
class Data
{
public:
Data();
~Data();
}
///
class Data;
class A
{
public:
A(){m_pData = new Data;};
~A()
{
if (m_pData != NULL)
{
delete m_pData;
m_pData = NULL;
}
};
inline void foo(Data *pData){
if(m_pData != NULL)
{
delete m_pData;
}
m_pData = pData;
private:
Data *m_pData;
}
/以上代码编译运行都没问题,问题在于当析构A时,类Data的析构函数是不运行的。也就是存在内存泄露,原因在于类A文件开始使用了前置声明而不是include "Data.h",将class Data改为# include "Data.h",内存泄露就没有了。
当前的代码之所以编译运行都没有问题,在于class的前置声明符合c++的可以合法地不列出实现细节的规则,但编译器却不知道这个类的具体内容,无法在delete的时候获得具体的方法,无法真正的delete m_pData;而这里#include “Data.h”不但包含了Data的定义,也包含了Data的实现细节,所以释放m_pData的时候,编译器完全能够准备的调用Data的析构函数。
结论:如果在头文件中对其他类的使用涉及到了类本身的构造(例:成员变量为Data uData或形参为Data &uData),析构,必须用include的形式