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

来源:互联网 发布:单片机的发展趋势 编辑:程序博客网 时间:2024/04/30 15:22

代码:

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的形式

0 0
原创粉丝点击