高手们,快帮我看一 下!!二维与三维数组的问题。高分赠送!!

lshforc 2004-04-17 10:42:36
//value已经定义
//LianJie已经定义为一个结构

//编译可以,但就是不能运行,高手快帮我看一下吧!!
//会不会内存泄露,或者有没有其他问题,肯请指点。


///////////////////////////////////////////(
//为3*3的二维数组gangdu分配空间
void getmem2(value **gangdu)
{
int i;

gangdu=new value* [3];
for(i=0;i<3;i++)
{
gangdu[i]=new value [3];
}
}
///////////////////////////////////////////)
///////////////////////////////////////////(
//释放3*3的二维数组所占的空间
void freemem2(value **gangdu)
{
int i;

for(i=0;i<3;i++)
delete [] gangdu[i];
delete [] gangdu;
}
///////////////////////////////////////////)
///////////////////////////////////////////(
//为n*n*n的三维数组tuopu分配空间
void getmem3(LianJie ***tuopu,int n)
{
int i,j;

tuopu=new LianJie** [n];
for(i=0;i<n;i++)
{
tuopu[i]=new LianJie* [n];
for(j=0;j<n;j++)
tuopu[i][j]=new LianJie [n];
}
}
///////////////////////////////////////////)
///////////////////////////////////////////(
//释放三维数组的空间
void freemem3(LianJie ***tuopu)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
delete [] (tuopu[i][j]);
delete [] (tuopu[i]);
}
delete [] tuopu;
}
///////////////////////////////////////////)
...全文
66 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
古布 2004-04-17
  • 打赏
  • 举报
回复
将开辟的指针地址返回,也可以解决。
用以维数组模拟也行,有些复杂,但保证内存的连续分配
freefalcon 2004-04-17
  • 打赏
  • 举报
回复
to oldjackyone:
是的,不能通过下标的方式访问,除非自己写一个类,并重载[]运算符
这不只是理解概念的问题,实际上是数组的另一种操作方式
zhouqingyuan 2004-04-17
  • 打赏
  • 举报
回复
可以参考下面的

#include <stdlib.h>
#include <iostream.h>
void getmem2(int ***gangdu)
{
int i;

*gangdu=new int* [3];
for(i=0;i<3;i++)
{
(*gangdu)[i]=new int[3];
}
}
///////////////////////////////////////////)
///////////////////////////////////////////(
//释放3*3的二维数组所占的空间
void freemem2(int ***gangdu)
{
int i;

for(i=0;i<3;i++)
delete [] (*gangdu)[i];
delete [] (*gangdu);
}
//为n*n*n的三维数组tuopu分配空间
void getmem3(int ****tuopu,int n)
{
int i,j;

(*tuopu)=new int** [n];
for(i=0;i<n;i++)
{
(*tuopu)[i]=new int* [n];
for(j=0;j<n;j++)
(*tuopu)[i][j]=new int[n];
}
}
///////////////////////////////////////////)
///////////////////////////////////////////(
//释放三维数组的空间
void freemem3(int ****tuopu,int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
delete [] ((*tuopu)[i][j]);
delete [] ((*tuopu)[i]);
}
delete [] (*tuopu);
}

int main(void)
{
int **p=0;
getmem2(&p);
p[0][0]=0;
cout<<**p<<endl;
freemem2(&p);
int ***q=0;
getmem3(&q,4);
q[0][0][0]=0;
cout<<***q<<endl;
freemem3(&q,4);
return 0;
}

oldjackyone 2004-04-17
  • 打赏
  • 举报
回复
你这些函数关键都是按值传递的,并没有按地址传递....

你把它们都改成按地址传递就可以了.,这里的按地址传递指的是指针的地址,可别忘了指针也是有地址的,

void getmem2(value **gangdu){....}
vlaue ** valuePoint;
gangdu(valuePoint);//这个是按指针值的传递.

改成:

void getmem2(value ***gangdu){....}//这里面的数据需要再次处理一下
vlaue ** valuePoint;
gangdu(&valuePoint);//这个是按指针地址值的传递.


你的三维数组的建立与析构也都存在这样的错误....


顺便问一下 freefalcon(心宇) :

*gangdu=new value[3*3];//能否按正常的二维数组的方式来取呢?好像不行吧,这种写法只能说可以代为理解多维数组的概念...
angelo23 2004-04-17
  • 打赏
  • 举报
回复
不妨改用引用,比如value *(&gangdu)[3] ;
freefalcon 2004-04-17
  • 打赏
  • 举报
回复
分配有问题吧
void getmem2(value **gangdu)
{
int i;

gangdu=new value* [3]; // 你这里使用是按Pass by value的方式,外部程序的gangdu并没有改变
for(i=0;i<3;i++)
{
gangdu[i]=new value [3];
}
}

你可以通过Pass by address的方式,下面没有测试,但思路是这样
void getmem2(value ***gangdu)
{
int i;

*gangdu=new value* [3];
for(i=0;i<3;i++)
{
(*gangdu)[i]=new value [3];
}
}

其实,如果你理解二维数组在内部是按照一维数组的方式连续存储的话,那么就简单得多
void getmem2(value **gangdu)
{
int i;

*gangdu=new value[3*3];
}

只是在使用的时候要按指针的方式,如
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
...(gangdu + i*3 + j) ...
lshforc 2004-04-17
  • 打赏
  • 举报
回复
我不太擅长评分,如有不妥,还望见谅!

今后还需要大家的帮助
lshforc 2004-04-17
  • 打赏
  • 举报
回复
rorot():
你的代码好象不不会泄露内存;
但是请问我的代码会泄露吗? 为什么?



(在哪里结帖?看不到“管理”啊!)
rorot 2004-04-17
  • 打赏
  • 举报
回复
象楼上说的那样,申请2维数组使用***指针传参,申请3维数组采用****指针传参,当然也正确。
rorot 2004-04-17
  • 打赏
  • 举报
回复
#include <iostream>

using namespace std;

// 申请释放二维数组内存
int GetMemory2(int** &array, int n);
int ReleaseMemory2(int** array, int n);
// 申请释放三维数组内存
int GetMemory3(int*** &array, int n);
int ReleaseMemory3(int*** array, int n);

int main()
// 自定义函数分配释放内存测试
{
int **array2 = NULL, ***array3 = NULL;

// 申请3×3内存
if ( !GetMemory2( array2, 3 ) )
return -1;
// 申请4×4×4内存
if ( !GetMemory3( array3, 4 ) )
return -1;

// 二维数组赋值测试
array2[0][2] = 1;
array2[1][2] = 2;
array2[2][1] = 3;
cout << array2[0][2] << "\n";
cout << array2[1][2] << "\n";
cout << array2[2][1] << "\n";

// 三维数组赋值测试
array3[0][2][3] = 1;
array3[0][3][2] = 2;
array3[3][1][0] = 3;
array3[2][2][3] = 4;
array3[1][3][2] = 5;
cout << array3[0][2][3] << "\n";
cout << array3[0][3][2] << "\n";
cout << array3[3][1][0] << "\n";
cout << array3[2][2][3] << "\n";
cout << array3[1][3][2] << "\n";
// 释放内存
ReleaseMemory2(array2, 3);
ReleaseMemory3(array3, 4);
return 0;
}

// 申请dimension维数组内存
int GetMemory2(int** &array, int n)
{
if ( (array = new int* [n]) == NULL )
return 0;
for (int i=0; i<n; ++i)
if ( (array[i] = new int [n]) == NULL)
return 0;
return 1;
}

// 释放二维数组内存
int ReleaseMemory2(int** array, int n)
{
for (int i=0; i<n; ++i)
delete []array[i];
delete []array;
return 0;
}


// 申请三维数组内存
int GetMemory3(int*** &array, int n)
{
if ( (array = new int** [n]) == NULL )
return 0;
for (int i=0; i<n; ++i)
{
if ( (array[i] = new int* [n]) == NULL)
return 0;
for (int j=0; j<n; ++j)
if ( (array[i][j] = new int [n]) == NULL)
return 0;
}
return 1;
}

// 释放三维数组内存
int ReleaseMemory3(int*** array, int n)
{
for (int i=0; i<n; ++i)
{
for (int j=0; j<n; ++j)
delete []array[i][j];
delete []array[i];
}
delete []array;
return 0;
}
rorot 2004-04-17
  • 打赏
  • 举报
回复
楼主老大,俺的表达能力有限。
我的意思是你在函数结束后,把原来指向的堆内存的指针丢了,这样就引起了内存泄漏。而堆类存不经过释放是不会消失。我的意思就是这样。
oldjackyone 2004-04-17
  • 打赏
  • 举报
回复
TO: freefalcon(心宇)

等不及要分了呐....

^_^


在本页中find"管理"二字,点击你就会操作了. :)
justaseeker 2004-04-17
  • 打赏
  • 举报
回复
关于内存分配,要返回指针的指针,安全有效
lshforc 2004-04-17
  • 打赏
  • 举报
回复
rorot() :你可能错了
getmem3函数是向堆申请内存,当该函数执行完后,只是这个函数的局部变量被
撤消,它申请的内存还是有效的

还是请大伙指教
rorot 2004-04-17
  • 打赏
  • 举报
回复
只要你修改你的函数参数,把所有的申请内存的函数的参数改成( value ** &ptr) 引用传递就可以了。
rorot 2004-04-17
  • 打赏
  • 举报
回复
试图通过一个参数为指针的自定义函数来申请堆内存,当前要错误的。因为这个函数在申请内存时,先把参数 value *p 在栈里面复制了一份,然后给这个栈地址的指针复制品申请了所谓的2维,3维数组内存,而当函数执行完后,栈撤销,你的2维,3维数组指针全丢了,还那儿来的数组啊?这里已经造成了内存泄漏。
vcchunhong 2004-04-17
  • 打赏
  • 举报
回复
好象不是那样的
我听老师说动态分配空间的时候
列数不能为变量~!
freefalcon 2004-04-17
  • 打赏
  • 举报
回复
都释放了,没有泄露
可以使用下标

结贴通过网页右上方的"管理"操作
lshforc 2004-04-17
  • 打赏
  • 举报
回复
其实和zhouqingyuan一样!
lshforc 2004-04-17
  • 打赏
  • 举报
回复
按照freefalcon和oldjackyone的建议,我把程序改为(其实和你们上面的差不多)

///////////////////////////////////////////(
void getmem2(value ***pgangdu)
{
int i;

*pgangdu=new value* [3];
for(i=0;i<3;i++)
{
(*pgangdu)[i]=new value [3];
}
}
///////////////////////////////////////////)
///////////////////////////////////////////(
void freemem2(value ***pgangdu)
{
int i;

for(i=0;i<3;i++)
delete [] (*pgangdu)[i];
delete [] (*pgangdu);
}
///////////////////////////////////////////)
///////////////////////////////////////////(
void getmem3(LianJie ****ptuopu,int n)
{
int i,j;

*ptuopu=new LianJie** [n];
for(i=0;i<n;i++)
{
(*ptuopu)[i]=new LianJie* [n];
for(j=0;j<n;j++)
(*ptuopu)[i][j]=new LianJie [n];
}
}
///////////////////////////////////////////)
///////////////////////////////////////////(
void freemem3(LianJie ****ptuopu)
{
int i,j;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
delete [] ((*ptuopu)[i][j]);
delete [] ((*ptuopu)[i]);
}
delete [] (*ptuopu);
}
///////////////////////////////////////////)

结果完全正确,运行正常!!!!!!
多谢楼上的各位仁兄!

另外,这样的代码会泄露内存吗?特别是释放的时候??
能否用下标??,比如:
LianJie lj;
LianJie ***tuopu;
getmem3(&tuopu,6);
tuopu[2][4][5]=lj;


还有,我该怎么结算我答应的100分,
因为不知道怎么操作,我的信誉被降低了。
不是我不给,而是我不知道按哪个按钮

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧