C++中涉及到的内存的管理问题可以归结为两方面:正确地得到它和有效
地使用它
什么情况下需要注意释放内存
堆内存泄漏(Heap leak):
对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生Heap Leak.
以下是会产生堆内存泄漏的几种情况:
1.有new就必然要有delete
在类的构造函数和析构函数中没有匹配的调用new和delete函数,当在构造函数中有new时,在析构函数一定要有delete,且必须是与构造函数中的delete形式对应的delete。
换句话说,除非类成员最初用了new,否则是不用在析构函数里用delete 的。
当程序中创建一个类指针对象并将其初始化的时候,只要该类有指针成员变量,且在构造函数中利用new操作符为该指针变量分配堆块上的内存时,我们就需要实时注意需要手动管理该段内存的释放。
CToolBoxBrowser::CToolBoxBrowser()
{
g_pTBTreeData = new sTBTreeItemData();
}
CToolBoxBrowser::~CToolBoxBrowser()
{
if (g_pTBTreeData)
{
delete g_pTBTreeData;
}
g_pTBTreeData = NULL;
}
函数中用new操作符对创建的类对象进行分配堆块上的内存时,需要在析构函数函数体中对该指针成员变量所占用的内存释放掉,若是指针对象则用delete object,若是指针数组,则用delete[] object。
这句话的意思是说,假如一个类中,有一个成员变量是指针变量,在一个函数fun()中使用 new为类对象分配了堆内存之后,一定要记得在析构中使用delete将内存释放。
//ToolBoxBrowser.h file
class CToolBoxBrowser
{
CToolBoxBrowser(){};
~CToolBoxBrowser();
public:
void funcA();
pravite:
sTBTreeItemData * m_pCurItem;
sTBTreeItemData * m_arrItems;
};
//ToolBoxBrowser.cpp file
void CToolBoxBrowser::funcA()
{
m_pCurItem = new sTBTreeItemData();
m_arrItems = new sTBTreeItemData[100];
}
CToolBoxBrowser::~CToolBoxBrowser()
{
if(m_pCurItem)
{
delete m_pCurItem;
}
delete [] m_arrItems;
}
2.在函数中的局部变量new什么时候delete
情况一,如果只是局部new出来用,然后在该func中就能使用完成,那就在使用完成那一刻就记得delete
void GetInitialPath(CString&a