本文共 1201 字,大约阅读时间需要 4 分钟。
// //Example 1 // #include <iostream.h>
class CFunction { public: CFunction() { data = new char[64]; };
~CFunction() { delete [] data; };
char *data;
};
class CFunctionEx : public CFunction { public: CFunctionEx() { m_data = new char[64]; };
~CFunctionEx() { delete [] m_data; };
private: char *m_data;
};
void main() { CFunction *pCFun = new CFunctionEx; delete pCFun;
}
你能看出什么问题吗?很显然,有内存泄漏。这是因为当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,所以导致内存泄漏。再看下例: // //Example 2 // #include <iostream.h> class CBase { public: CBase() { data = new char[64]; };
~CBase() { delete [] data; };
char *data;
}; class CFunction { public: CFunction(){}; ~CFunction(){};
}; class CFunctionEx : public CFunction { public: CFunctionEx(){}; ~CFunctionEx(){};
private: CBase m_cbase;
}; void main() { CFunction *pCFun = new CFunctionEx; delete pCFun;
} 你能看出什么问题吗?这里CfunctionEx和Cfunction中本身并没有分配内存,应该不会有内存泄漏。和上例一样当删除pCFun时,它只调用了Cfunction的析构函数而没调用CfunctionEx的析构函数,但CfunctionEx本身并没分配内存,是什么地方有内存泄漏我不说大家也应该知道了吧。不错是m_cbase,因为它是Cbase的实例且是CfunctionEx成员变量,当CfunctionEx的的析构函数没有被调用时,当然m_cbase的析构函数也没有被调用,所以Cbase中分配的内存被泄漏。 解决以上问题的方法很简单,就是使基类Cfunction的析构函数为虚函数就可以了 转载于:https://www.cnblogs.com/lidan/archive/2011/08/17/2239486.html