现在的位置: 首页 > 综合 > 正文

C++库研究笔记—— [真正正确?]多维数组动态分配正确方式?(之一)

2013年04月24日 ⁄ 综合 ⁄ 共 2155字 ⁄ 字号 评论关闭

google:

多维数组 c++

前5条结果是:

  1. C++多维数组的动态分配(new)和释放(delete)
    - Sylla Zhang - 博客园

    www.cnblogs.com/Sylla-Zhang/archive/.../2715300.html

    轉為繁體網頁

    2012年10月8日 - 1 int **array2D; 2 //假定数组第一维长度为m, 第二维长度为n 3 //动态分配空间 4 array2D = new int *[m]; 5 for( int i=0; i<m; i++ )
    6 { 7 array2D[i] ...

  2. C++二维数组的定义和引用_微学苑

    see.xidian.edu.cn/cpp/biancheng/view/152.html

    轉為繁體網頁

    具有两个下标的数组称为二维数组有些数据要依赖于两个因素才能惟一地确定,例如有3个学生,每个学生有4门课的成绩,显然,成绩数据是一个二维表,如书中表5.1所示 ...

  3. C++二维数组讲解、二维数组的声明和初始化_微学苑

    see.xidian.edu.cn/cpp/biancheng/view/44.html

    轉為繁體網頁

    2012年5月8日 - 我们知道,一维空间是一条线,数学中用一条数轴来表达;二维空间是一个平面,数学中用平面坐标系来表达。那么二维数组又是什么样的呢? 线与面 ...

  4. C++多维数组:存储方式、访问方式和作为函数参数_微学苑(编程第一站)

    www.weixueyuan.net/view/5846.html

    轉為繁體網頁

    C++中数组可以嵌套,就是多维数组。 多维数组存储与访问方式二维数组:一维数组可对应数学中的向量,而二维数组可对应矩阵,可用一个二维数组存储矩阵。 图1 二 ...

  5. C++多级指针与多维数组_微学苑(编程第一站)

    www.weixueyuan.net/view/5852.html

    轉為繁體網頁

    多级指针的概念多级指针可对应于多维数组,这种指针变量中存的是另一个指针变量的地址,其说明如下: int val=10; int *ptr=val; int **pptr=ptr; int ***ppptr=pptr; //是 ...

都有问题!

a[100][100] 不能解决动态分配,且不能分配大数组,首先抛弃

google 排列第一位的:(也是常被认为正确的)

C++:多维数组的动态分配(new)和释放(delete)

实现如下:

int **array2D;
//假定数组第一维长度为m, 第二维长度为n
//动态分配空间
array2D = new int *[m];
for( int i=0; i<m; i++ )
{
    array2D[i] = new int [n]  ;
}
//释放
for( int i=0; i<m; i++ )
{
    delete [] arrar2D[i];
}
delete array2D;


表面上没有问题,实际存在潜在可能的内存泄漏:在for循环中,一旦某一个new 失败(内存不够out of memory), 先前分配的内存将不能被释放,在内存耗尽后,内存仍然不能释放,问题是严重的。

后来在cwp su(http://www.cwp.mines.edu/cwpcodes/)上找到了一比较好的实现(不愧是使用27年的代码,且是专门针对数值计算)

部分代码如下:

////////////////////////////////////////////////////////////////////
/* allocate a 2-d array */
/* n2 代表行数      */
template <typename T>
T **new_array2d (size_t n2, size_t n1)
{
	size_t i2;
	void **p;

	if ((p=(void**)malloc(n2*sizeof(void*)))==NULL) 
		throw std::bad_alloc();
	if ((p[0]=(void*)malloc(n2*n1*sizeof(T)))==NULL) {
		free(p);
		throw std::bad_alloc();
	}
	for (i2=0; i2<n2; i2++)
		p[i2] = (char*)p[0]+sizeof(T)*n1*i2;
	return (T**)p;
}

template <typename T>
T *new_array1d (size_t n1)
{
	void *p;


	if ((p=malloc(n1*sizeof(T)))==NULL)
		throw std::bad_alloc();
	return (T*)p;
}
/* free a 2-d array */
template <typename T>
void delete_array2d (T **p)
{
    if(p==0)return;
    void **p2=(void**)p;
	free(p2[0]);
	free(p2);
}

这段代码的精妙之处在于,分配的内存连续,如 

float **a=new<float>(3,4)

a[0][0]  <====>a[0]

a[0][1] <=====>a[1](等价)

没有内存泄漏,分配失败后会释放内存

完美?

这些代码我使用了一年,没有发现任何问题。

直到这两天,这段代码有一个巨大的

(掉进坑里,最直接的原因:忘记这段代码的适用范围, 且从来没有怀疑它的绝对正确性)

参见:C++库研究笔记—— [真正正确?]多维数组动态分配正确方式?(之二)

抱歉!评论已关闭.