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的形式
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++中头文件相互包含的几点问题
- C++中的“include”,“namespace”以及“前置声明”
- C++中头文件中是包含include还是包含类的前置声明
- 关于前置声明与C++中头文件相互包含的几点问题
- C++ 前置声明的问题
- 前置声明与C++头文件互相包含导致的error: 'xxx' does not name a type问题
- 关于前置声明与C++中头文件相互包含的几点问题
- c/c++ 前置声明 -- typedef问题
- 枚举和前置声明以及可能引起的问题
- c/c++ 前置声明 -- typedef问题
- c/c++ 前置声明 -- typedef问题
- C++中头文件中是包含include还是包含类的前置声明
- C++中头文件中是包含include还是包含类的前置声明
- c++ 之类的前置声明
- C++模板类的前置声明
- [C++]前置声明和头文件
- 『转』c++之 类的前置声明
- C++中函数中声明函数的问题—————我也诡异了一把
- c++中类对象直接作为函数参数所引起的问题。
- C++的前置声明