鱼C论坛

 找回密码
 立即注册
查看: 4225|回复: 8

怎么delete一个存放char*型字符串的二维数组???

[复制链接]
发表于 2013-6-13 16:08:47 | 显示全部楼层 |阅读模式
3鱼币
  1. #include<iostream>
  2. using namespace std;

  3. char ***a(int n,int m)
  4. {
  5.         char ***arry=new char **[n];
  6.         char **arry2=new char *[m];
  7.         for (int i=0;i<n;i++)
  8.         {        
  9.                 arry[i]=arry2;
  10.                 for (int j=0;j<m;j++)
  11.                 {
  12.                         arry[i][j]="hahaaaaa";
  13.                         cout<<arry[i][j]<<endl;
  14.                 }
  15.         }
  16.         return arry;
  17. }


  18. int main()
  19. {
  20.         int num1,num2;
  21.         cin>>num1;
  22.         cin>>num2;
  23.         char ***arry=a(num1,num2);

  24.         for (int i=0;i<num1;i++)
  25.         {
  26.                 for (int j=0;j<num2;j++)
  27.                 {
  28.                         delete arry[i][j];
  29.                         arry[i][j]=NULL;
  30.                 }
  31.                 delete arry[i];
  32.                 arry[i]=NULL;
  33.         }
  34.         return 0;
  35. }
复制代码



这是我试验的代码 delete总出错 求解释~~

最佳答案

查看完整内容

昏,循环里面不需要执行delete
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-13 16:08:48 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-13 16:56:40 | 显示全部楼层
你的错误在于,申请分配内存就两次,却想释放多次。
改了一点的代码:
  1. #include<iostream>
  2. using namespace std;

  3. char ***a(int n,int m)
  4. {
  5.         char ***arry=new char **[n];
  6.         char **arry2=new char *[m];
  7.         for (int i=0;i<n;i++)
  8.         {        
  9.                 arry[i]=arry2;
  10.                 for (int j=0;j<m;j++)
  11.                 {
  12.                         if (i==0)
  13.                         {
  14.                                 arry[i][j]="hahaaaaa";                               
  15.                         }else
  16.                         {
  17.                                 arry[i][j]="ccccccccc";
  18.                         }
  19.                         //cout<<arry[i][j]<<endl;
  20.                 }
  21.         }
  22.         return arry;
  23. }


  24. int main()
  25. {
  26.         int num1,num2;
  27.         cin>>num1;
  28.         cin>>num2;
  29.         char ***arry=a(num1,num2);

  30.         for (int i=0;i<num1;i++)
  31.         {
  32.                 for (int j=0;j<num2;j++)
  33.                 {
  34.                         cout<<arry[i][j]<<endl;
  35.                 }
  36.         }
  37.         delete[] arry[0];
  38.         delete[] arry;
  39.         _flushall();
  40.         getchar();
  41.         return 0;
  42. }
复制代码
函数里面的代码修改就是可以证明你两次用的都是同一份内存。
程序运行结果可以看到,前面保存的被后面的字符串覆盖了。
QQ截图20130613165432.jpg

评分

参与人数 1鱼币 +1 收起 理由
fanki + 1 热爱鱼C^_^给力。!!有你更精彩。!!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-14 00:32:06 | 显示全部楼层
二楼的解释非常给力,楼主可以看看二楼的。支持支持。
动态创建的空间,一块空间只能delete 或者 free一次。
delete里面其实是调用了free,如果同一块空间释放多次的话就会产生double free的问题。
编译器会报错的,其实只要用释放一次指针指向的空间一次就好啦。
楼主给力,一起学习,加油加油。{:7_155:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-14 08:51:10 | 显示全部楼层
小新110 发表于 2013-6-13 16:56
你的错误在于,申请分配内存就两次,却想释放多次。
改了一点的代码:
函数里面的代码修改就是可以证明你 ...

昨天贴出来的代码写错了
其实我的问题是在下面代码里的第一个delete
  1. #include<iostream>
  2. using namespace std;

  3. char ***a(int n,int m)
  4. {
  5.         char ***arry=new char **[n];
  6.         for (int i=0;i<n;i++)
  7.         {   
  8.                 char **arry2=new char *[m];
  9.                 for (int j=0;j<m;j++)
  10.                 {
  11.                         char *arry3=new char[10];
  12.                         arry3="hahaaaaa";
  13.                         arry2[j]=arry3;
  14.                         cout<<arry2[j]<<endl;
  15.                 }       
  16.                 arry[i]=arry2;
  17.         }
  18.         return arry;
  19. }


  20. int main()
  21. {
  22.         int num1,num2;
  23.         cin>>num1;
  24.         cin>>num2;
  25.         char ***arry=a(num1,num2);

  26.         for (int i=0;i<num1;i++)
  27.         {
  28.                 for (int j=0;j<num2;j++)
  29.                 {
  30.                         //cout<<arry[i][j]<<endl;
  31.                         cout<<"i="<<i<<"        j="<<j<<"        :        "<<arry[i][j]<<endl;
  32.                         delete arry[i][j];
  33.                 }
  34.                 delete arry[i];
  35.         }
  36.         delete[] arry;
  37.         delete arry;
  38.         return 0;
  39. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-14 19:17:51 | 显示全部楼层
好好学习,天天向上,认真看完了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-14 20:50:24 | 显示全部楼层
小新110 发表于 2013-6-14 14:43
昏,循环里面不需要执行delete

为什么不需要呢 字符串是new的啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-6-14 21:14:19 | 显示全部楼层
看起来指针很复杂的样子
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-17 09:44:15 | 显示全部楼层
不要沉啊 。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-23 22:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表