如何在C++中动态分配二维数组

如何在C++中动态分配二维数组,第1张

如何在C++中动态分配二维数组,第2张

这个问题我之前揉CSDN的时候应该已经回答过很多次了。我的回答一般是三种方式:(1)使用vector的vector,(2)先赋一个指针数组,然后让里面的每个指针都指向一个数组。这种方法的优点是在访问数组元素时很直观,可以写成类似[x][y]的形式。缺点是相当于C# (3)中的一个直接分配一个x*y大小的一维数组,这样可以保证空之间的连续性,但是访问数组元素不直观。对于我的“经典”回答,我当时还挺自豪的,至少从评分的角度来说,这个回答还是很有效果的。

今天在ChinaUnix论坛逛的时候看到一个帖子,再次证明我对C++并不精通。

# include
# include
# include
void * * darray _ new(int row,int col,int size)
{
void * * arr;
arr =(void * *)malloc(sizeof(void *)* row+size * row * col);如果(arr!= NULL)
{
void * head;
head =(void *)arr+sizeof(void *)* row;memset(arr,0,sizeof(void *)* row+size * row * col);while(row-)
arr[row]= head+size * row * col;
}
return arr;
}
void darray _ free(void * * arr)
{
if(arr!= NULL)
free(arr);
}

嗯,内存是连续分配的,可以用[x][y]的方式访问!可谓是动态分配二维数组的绝妙方法!这个程序是C的,改成支持对象分配的C++版本似乎不难(不过估计得用placement new了。嗯,我们需要再考虑一下……)。

实验后发布C++版本:)重点是placement new和显示的析构函数调用,用来保证对象可以正常构造和析构。

这种实现还是有很多缺点的,比如必须记住数组的大小才能保证销毁所有对象。但是,这可以通过改进分配算法来实现,并稍微节省一点数组大小空。

另一个缺点是,从语法的角度来看,人们很容易将darray_new返回的指针误认为是数据区的起始地址,这可能会导致一些逻辑错误。
# include
# include
# include
template
T * * darray _ new(int row,int col)
{
int size = sizeof(T);
void * * arr =(void * *)malloc(sizeof(void *)* row+size * row * col);
如果(arr!= NULL)
{
unsigned char * head;
head =(unsigned char *)arr+sizeof(void *)* row;
for(int I = 0;I <排;++ I)
{
arr[I]= head+size * I * col;
for(int j = 0;j < col++ j)
new(head+size *(I * col+j))T;
}
}
return(T * *)arr;
}
template
void darray _ free(T * * arr,int row,int col)
{
for(int I = 0;I <排;++ I)
for(int j = 0;j < col++j)
arr[i][j]。~ T();
如果(arr!= NULL)
free((void * *)arr);
}

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 如何在C++中动态分配二维数组

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情