CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

一个动态2维数组指针如何删除

楼主xbt746(头上无毛)2005-11-15 18:24:34 在 C/C++ / C++ 语言 提问

申请了一个动态2维数组指针  
  int   (*temp3)[7]=new   int[][7];  
                    delete   []temp3;  
  这样删除却有错误  
  debug   error  
  DAMAGE:after   normal   block(#69)   at   0x0049ff0  
  问题点数:20、回复次数:12Top

1 楼xiaocai0001(高楼目尽欲黄昏/梧桐叶上萧萧雨)回复于 2005-11-15 18:28:35 得分 1

这样也能申请二维指针?  
   
  没见过,   我试试看.Top

2 楼aglg(aglg)回复于 2005-11-15 18:33:37 得分 0

这样不能生成二维数组的吧Top

3 楼JACKEY6108(冬天的一把火)回复于 2005-11-15 18:36:36 得分 2

这样的确可以申请二维指针,  
  但是释放空间的时候要先释放第二维的,  
  要不就内存泄漏Top

4 楼liwf(一叶孤舟)回复于 2005-11-15 18:40:42 得分 2

int   (*temp3)[7]=new   int[][7];  
   
  这一行有误,应该是这样的吧:  
  int   (*temp3)[7]=new   int[i][7];       //   i   是一正整数。Top

5 楼wangya110()回复于 2005-11-15 19:09:44 得分 5

//用二级指针可以模拟二维数组!  
  int   i;//行  
  int   j;//列  
  int   *   *temp=new   int   *[i];  
  for(int   t=0;t<i;t++)  
  {  
        temp[i]=new   int[j];  
  }  
  for(t=0;t<i;t++)  
  {  
        delete   []   temp[i];  
  }  
  delete   []temp;  
  /*注意释放内存空间时,肯定先释放第二维的!嘿嘿大家可以试试啊*/  
  Top

6 楼whatsouta(某疯子)回复于 2005-11-15 20:33:25 得分 5

试了一下,直接  
          int   (*temp3)[7]=new   int[][7];  
  这样无法申请  
          [C++   Error]   Unit1.cpp(14):   E2034   Cannot   convert   'int   (   *)[1]'   to   'int   (   *)[7]'  
  不知道楼主是什么环境下搞的,应该和编译器的实现有关了。  
  我是在BCB6+WIN2K  
  不过从语法来看,数组的大小应该是可以确定的:7   *   7。因而,这样申请空间是可行的。  
   
  另外,删除指针的时候,M维数组应该自行释放从第M维到第2维的空间,最后释放第1维空间。  
  Top

7 楼whatsouta(某疯子)回复于 2005-11-15 20:59:53 得分 3

#include   <stdio.h>  
  #include   <stdlib.h>  
   
  int   main(int   argc,   char*   argv[])  
  {  
  int   m   =   5;  
  int   (*tmp)[7]   =   new   int[m][7];  
  int   k   =   0;  
   
  for   (int   i   =   0;   i   <   m;   ++i)  
  for   (int   j   =   0;   j   <   7;   ++j)  
          tmp[i][j]   =   ++k;  
   
  for   (int   i   =   0;   i   <   m;   ++i)  
  {  
          for   (int   j   =   0;   j   <   7;   ++j)  
                  printf("%4d",   tmp[i][j]);  
   
          printf("\n");  
  }  
   
  for   (int   i   =   0;   i   <   7;   ++i)     //   *1  
          delete   []   tmp[i];                 //   *2   这里会出错  
   
  delete   []   tmp;  
   
  system("pause");  
  return   0;  
  }  
   
  上面这个程序  
  如果保留第*1、*2二行,则无法释放空间,提示访问内存错误。  
  如果去掉则可以正常退出。Top

8 楼whatsouta(某疯子)回复于 2005-11-15 21:00:42 得分 0

盼望有高手来指点一二Top

9 楼zenny_chen(ACE Intercessor)回复于 2005-11-15 21:30:51 得分 2

你用int   (*tmp)[7]   =   new   int[m][7];  
  说明是为指向元素个数为7的数组指针进行动态分配空间。很显然,被动态分配的仅仅是tmp,即int(*)[7]类型的指针。而tmp[i]并没有被动态分配。  
  除非你用int   **tmp;   tmp   =   new   int*[m];   for(int   i=0;   i<m   ;i++)tmp[i]   =   new   int[7];  
  这样,你就可以用delete[]   tmp[i]了。因为除了tmp以外,tmp[i]也被动态分配了。Top

10 楼xbt746(头上无毛)回复于 2005-11-15 21:33:29 得分 0

明白了Top

11 楼zenny_chen(ACE Intercessor)回复于 2005-11-15 21:36:59 得分 0

int   (*tmp)[7]   =   new   int[m][7];  
   
  然后用delete[]   tmp;   并不会造成内存泄漏。因为该delete的已经delete了。  
   
  原因很简单。因为tmp是指向int[7]类型的指针,即int(*)[7]类型。因此只要将第一维即动态分配的那维(也就是int[7]数组的地址)删掉,那么第二维当然会跟着被删除。Top

12 楼xbt746(头上无毛)回复于 2005-11-15 21:40:38 得分 0

用的是VC6.0Top

相关问题

  • 关于动态二维数组的指针的释放
  • 如何删除动态多维数组的内存分配
  • 关于动态分配二维数组时,指针的释放问题!
  • 二级指针(二维数组)的动态内存分配与释放问题?
  • 多维数组指针
  • 用指针表示二维数组?
  • 多维数组指针如何写?
  • 动态二维数组?
  • 关于指针的指针和二维数组的疑问
  • 二级指针 如何转换成 二维数组的指针?

关键词

  • mp3
  • 指针
  • 二维
  • temp3
  • 申请

得分解答快速导航

  • 帖主:xbt746
  • xiaocai0001
  • JACKEY6108
  • liwf
  • wangya110
  • whatsouta
  • whatsouta
  • zenny_chen

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo