存档

文章标签 ‘数组指针’

动态二维数组的申请与释放:使用指针数组和数组指针在物理空间上的区别

2012年3月18日 没有评论

---

上一篇文章中,我们提到使用数组指针申请动态二维数组时的释放问题,在C/C++中,动态申请二维数组有两种方式,一种是先申请一个指向所需类型的指针数组,然后对数组中的每个元素再依次申请空间,在物理形态上该方法申请了两次空间;另一种是使用数组指针直接申请所需的空间,物理形态上该方法只申请了一次空间。

二者在内存的物理空间上是具有不同的表现形式的,如图所示,本节我们就简单讨论下。

两种方法皆见代码,为了对比,我们也定义了一个一维数组;为了验证上面所说的二者在物理空间上的形态差别,我们分别输出了一系列变量。

阅读全文...

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

2012年3月18日 1 条评论

---

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

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();//调试运行到该步,输出检测信息
}

阅读全文...