读书人

二维动态数组的删除有关问题

发布时间: 2013-08-01 15:23:18 作者: rapoo

二维动态数组的删除问题

#include <iostream>

using namespace std;

int main()
{
int i,j;
double **a=new double *[3];
double **b=new double *[3];

for (i=0;i<3;i++)
{
a[i]=new double [4];
b[i]=new double [4];
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{
a[i][j]=i+j;
}
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{

b[i]=a[i];
//b[i][j]=a[i][j];
}
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}



for (i=0;i<3;i++)
{
delete[] b[i];
b[i] = NULL;
}
delete []b;
b=NULL;

cout<<"OK"<<endl;
for (i=0;i<3;i++)
{
delete[] a[i];
a[i]=NULL;
}
delete []a;
a=NULL;

return 0;

}


你好,这是我试用二维数组动态分配的小程序,比较简单,测试用的。
当使用通过指针将a[i]赋予b[i]时,删除b数组没有问题,但无法动态删除a数组;
而使用通过值传递将a[i][j]赋予b[i][j]时,能正常的删除动态数组a和b。
请教各位高人这是什么问题啊?有什么办法么让指针传递也能正常删除,每次值传递感觉效率比较慢哦。

谢谢了。 二维数组动态删除 C++
[解决办法]

//在堆中开辟一个4×5的二维int数组
#include <stdio.h>
#include <malloc.h>
int **p;
int i,j;
void main() {
p=(int **)malloc(4*sizeof(int *));
if (NULL==p) return;
for (i=0;i<4;i++) {
p[i]=(int *)malloc(5*sizeof(int));
if (NULL==p[i]) return;
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {


p[i][j]=i*5+j;
}
}
for (i=0;i<4;i++) {
for (j=0;j<5;j++) {
printf(" %2d",p[i][j]);
}
printf("\n");
}
for (i=0;i<4;i++) {
free(p[i]);
}
free(p);
}
// 0 1 2 3 4
// 5 6 7 8 9
// 10 11 12 13 14
// 15 16 17 18 19


[解决办法]
delete []a 就行了,不需要for delete []a[i]
[解决办法]
当LZ将a[i]赋予b[i]以后,删除b数组实际是删除了a数组,这样再删除a数组就出错了。

[解决办法]
引用:
#include <iostream>

using namespace std;

int main()
{
int i,j;
double **a=new double *[3];
double **b=new double *[3];

for (i=0;i<3;i++)
{
a[i]=new double [4];
b[i]=new double [4];
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{
a[i][j]=i+j;
}
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{

b[i]=a[i];
//b[i][j]=a[i][j];
}
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}

for (i=0;i<3;i++)
{for (j=0;j<4;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}



for (i=0;i<3;i++)
{
delete[] b[i];
b[i] = NULL;
}
delete []b;
b=NULL;

cout<<"OK"<<endl;
for (i=0;i<3;i++)
{
delete[] a[i];
a[i]=NULL;
}
delete []a;
a=NULL;

return 0;

}


你好,这是我试用二维数组动态分配的小程序,比较简单,测试用的。
当使用通过指针将a[i]赋予b[i]时,删除b数组没有问题,但无法动态删除a数组;


而使用通过值传递将a[i][j]赋予b[i][j]时,能正常的删除动态数组a和b。
请教各位高人这是什么问题啊?有什么办法么让指针传递也能正常删除,每次值传递感觉效率比较慢哦。

谢谢了。



你这是内存泄漏问题,处理好就不会有,处理不好就会有。

传递指针用smart pointer 引用计数机制,写时拷贝,做成类吧!




[解决办法]
new 和 delete 对应,
new 了多少次, 就要 delete 多少次.

既然 b[i] 是 new 出来的, 那么把 b[i] 赋值成 a[i] 之前就需要先 delete b[i], 否则 b[i] 原来 new 的内存就泄露了.
[解决办法]
引用:
当使用通过指针将a[i]赋予b[i]时,删除b数组没有问题,但无法动态删除a数组;


这时原来赋值到b[i]的那些指针都没有删除,而原本赋值到a[i]的指针删除了两变。

动态数组的维护是很麻烦的事,最好用类封装起来,自动进行释放和分配,赋值时重分配然后拷贝(就象std::basic_string那样)。

要实现内存共享(用指针赋值)的动态数组更麻烦,不用引用计数的话基本上都会有问题。

读书人网 >C++

热点推荐