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的形式
- C++ 前置声明和include引起的问题
- #include和前置声明
- 1. include和前置声明的使用
- 前置声明和#include指令的划分
- 正确使用#include和前置声明
- #include 和前置声明——2
- 前置声明与#include
- #include与前置声明
- C++ 前置声明的问题
- 类前置声明的问题
- C语言的不完整类型和前置声明
- C语言的不完整类型和前置声明
- C语言的不完整类型和前置声明
- 类的前置声明(forward declaration)和包含头文件(#include)的区别
- C++类中使用前置声明和使用include包含头文件的感想
- 正确使用#include和前置声明(forward declaration)
- 正确使用#include和前置声明(forward declaration)
- 正确使用#include和前置声明(forward declaration)
- 算法导论基础知识--快速排序
- 基于SSLStrip的HTTPS会话劫持
- php中preg_replace()和ereg_replace()函数的用法区别
- poj 2762 Going from u to v or from v to u?(强连通分量)
- 初步认识WCF
- C++ 前置声明和include引起的问题
- 解决android sdk下载难问题的终极解决办法-使用国内镜像
- 【Unity Shaders】Unity里的雾效模拟
- BZOJ 1132 POI2008 Tro 计算几何
- 第14周项目2-带姓名的成绩单
- Deprecated: Function ereg_replace() is deprecated的解决方法
- 利用C++编写一个“猜数字”游戏
- glut 显示 obj 模型
- Android手机上使用MATLAB