C++程序中如何尽量避免内存泄漏

C++中涉及到的内存的管理问题可以归结为两方面:正确地得到它和有效地使用它什么情况下需要注意释放内存堆内存泄漏(Heap leak):对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存,再是完成后必须通过调用对应的 free或者delete 删掉。如果程序的设计的错误导致这部分内存没有被释放,那么此后这块内存将不会被使用,就会产生He...
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值