您的位置:首页 > 编程语言 > C语言/C++

C++ 前置声明和include引起的问题

2014-11-29 13:48 190 查看
代码:

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的形式
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 前置声明