首页 > C/C++ > C/C++内存泄漏检测 & 数组指针的空间释放

C/C++内存泄漏检测 & 数组指针的空间释放

2012年3月18日 发表评论 阅读评论
文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathinking.com)   转载请注明,谢谢合作。

---

周一助教上机课,有学生问到动态申请的二维数组空间如何释放,对于使用二维指针申请的只要一步步释放掉就可以了,让人可能产生疑惑的就是使用数组指针申请的情况,即

int (*p)[3] = new int [4][3];
// ...
delete []p;    //---1
delete[](*p);  //---2

在释放这个二维数组时,应该使用1和2哪种方式呢?哪种对呢?

其实静心分析下,并不难,哪种写法都是对的。

为什么?

首先我对于每种释放情况都测试内存是否有泄漏,以此验证释放的正确性;然后我们使用最直接的方法输出相关数据来验证释放的正确性。

对于C/C++如何检测内存泄露,就是简单的库调用,这里不赘述,详见下面代码和参考文献,不过注意,检测结果的信息输出是在调试的情况下查看输出窗口(output)的

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#include <stdio.h>

void main()
{
	int (*p)[3] = new int [4][3];

	//delete []p;
	delete[](*p);

	_CrtDumpMemoryLeaks();//调试运行到该步,输出检测信息
}

执行如代码所示,对于两种释放方式,都没有检测出内存泄露,说明这两种方式都是正确的。

其实完全没必要如此绕弯弯来做,上面只是从检测的角度验证释放的正确性,至于为什么,我们还是要究其所以然,方法很简单,将所疑惑的地方输出看看就可以了,请看下面代码

#include <stdio.h>

void main()
{
	int (*p)[3] = new int [4][3];
	printf("数组指针:\np:\t%d\n*p:\t%d\n",p,*p);
	delete []p;
}

输出结果如下:

说白了,原理只有一句话:数组名就是指向数组第一个元素的引用/指针,即第一个元素的地址。在这里p相当于指向二维数组的指针,它等于第一个元素的地址,*p相当于指向一维数组的指针,它的地址也是第一个元素的地址,二者都等于&p[0][0]。故二者的打印结果是一样的。其实如果了解数组指针是如何申请空间的原理就很容易理解这个问题了。

无论使用哪种方式,都不要漏掉中括号“[]”,delete跟free不一样,C++调试会发现delete p和delete [] p执行的代码是不一样的。

写到这里,我感觉可以在下一篇博客形象地描述下动态申请二维数组的不同形式,以及稍微记录下new/delete和malloc/free的区别

(全文完)

参考文献:

http://msdn.microsoft.com/zh-cn/library/x98tx3cf.aspx

http://www.cppblog.com/Lyt/archive/2009/03/22/77517.html

  • http://mazheng.org 冰上游鱼

    哦 vc++竟然自带内存泄漏检测的方法,学习了。