二维动态数组的删除问题
#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数组就出错了。
[解决办法]
你这是内存泄漏问题,处理好就不会有,处理不好就会有。
传递指针用smart pointer 引用计数机制,写时拷贝,做成类吧!
[解决办法]
new 和 delete 对应,
new 了多少次, 就要 delete 多少次.
既然 b[i] 是 new 出来的, 那么把 b[i] 赋值成 a[i] 之前就需要先 delete b[i], 否则 b[i] 原来 new 的内存就泄露了.
[解决办法]
这时原来赋值到b[i]的那些指针都没有删除,而原本赋值到a[i]的指针删除了两变。
动态数组的维护是很麻烦的事,最好用类封装起来,自动进行释放和分配,赋值时重分配然后拷贝(就象std::basic_string那样)。
要实现内存共享(用指针赋值)的动态数组更麻烦,不用引用计数的话基本上都会有问题。