C++动态删除数组

……
N=10;
……

Complex **X;
X=new Complex *[N];
for(i=0;i<N;i++)
{X[i]=new Complex[N];}

…………

getchar();

for(i=0;i<N;i++)
{delete []X[N];}
delete []X;

我的程序如上,其中Complex是我定义的一个结构体,动态地分配两个二维数组,然后进行数字计算,程序运行到getchar时调试正常,没有任何问题,继续运行时,出了问题。VS2008:

NRM.exe 中的 0x102d31ea (msvcr90d.dll) 处未处理的异常: 0xC0000005: 读取位置 0xfdfdfdf1 时发生访问冲突。

我在调试时也出现过类似的错误,是因为我对动态数组的赋值维数超过了动态分配的维数。而此时我只是建立多少删多少,为什么会出问题呢?应如何改正?谢谢。

  当数组使用完毕,释放空间的代码是:
  for(int i = 0; i != 5; i++)
{
delete[] p[i];
}
delete[] p;
  处理二维数组,可以用降维或是二维法。
降维法是用一位数组来接受二维数组,将二维元素的首地址&a[0][0]作为参数,传递给函数,函数用int *接受。
二维法就直接用二维数组来接受,但是需要指定列数。

  C++中的Delete
  new/ delete 的使用(仅限于c++,注意,new、delete不是函数而是操作符!注意与c中的malloc和free区分)编程的时候经常要用到堆内存的分配,通常使用的操作符是new,这个时候就必然要用到delete去释放申请的内存空间。
  此时至少要遵循以下原则:
  (1)new和delete是成对出现的。只出现一个是错误的或不规范的写法,即使能编译通过,也会有安全隐患;
  (2)使用的new与delete要相同。也就是说如果在 new表达式中使用了 [],必须在对应的 delete 表达式中使用 []。如果在 new 表达式中没有使用 [],也不必在对应的 delete 表达式中使用 []。
  (3)对一个指针只能使用一次运算符delete;
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-04-24
Complex **X; //定义指向Complex指针的指针x;
X=new Complex *[N]; //声请N个Complex指针,然后让x指向它;
for(i=0;i<N;i++)
{X[i]=new Complex[N];}//分别使N个指针指向N个complex的对象。

所有的这些个工作等同于:Complex (*X)[N] = new Complex [N][N];
即是定义一个指向有N个元素的行指针X。删除元素:
for (int j = 0; j < 2; ++j)
delete x[j]; //或delete []x[i];都可以的。
你的由于是单个动态申请的内存;
for(i=0;i<N;i++)
{delete []X[i];}//删除数组元素,但是你申请的N个行指针还没有删除。

delete []x;//删除n个行指针。

参考资料:/

第2个回答  推荐于2018-03-07
循环删除里的delete[] x[N]要改成delete[] x[i]本回答被提问者和网友采纳
第3个回答  2010-04-24
Complex **X你赋予了3维空间;
这样理解的{X[i]=new Complex[N];}

这个是对行首地址的赋值,2维空间的行指针
的赋值,如此在加*,岂不3维空间
改为Complex *x
第4个回答  2010-04-24
很简单

是因为申请的空间没有完全释放,所以才会执行的时候有错
相似回答