C++ 类中的二维数组动态分配有关问题

C++ 类中的二维数组动态分配问题
本帖最后由 yy198698 于 2013-06-20 11:25:35 编辑
这是目前学习测试的一段小代码,麻烦高手看看问题:
class Neuralnet 
{
private:

//单元网络的基本数目
int m_nInput;    //输入层单元数目
int m_nHidden;   //隐藏层单元数目
int m_nCase;     //打包的数据个数  

double **Input;   //输入层参数
double *yy;
public:
Neuralnet(int nInput, int nHidden, int nCase);
~Neuralnet();
void CreateNetwork(); //建立网络,为各层单元分配空间
void InitializeNetwork();
void shanchu();
};

主要是两个函数的问题:

void Neuralnet::CreateNetwork()
{
int i;
//初始化神经网络基本参数
Input = new double *[m_nCase];
yy = new double [m_nCase];

for (i=0;i<m_nCase;i++)
{
Input[i] = new double [m_nInput];
}
}

void Neuralnet::shanchu()
{
int i;
//删除参数空间
if(Input != NULL)
{
for (i=0; i<m_nCase;i++)
{
cout<<endl;
cout<<i;
delete[] Input[i];
Input[i]=NULL;
}

delete[] Input;
Input=NULL;
}
delete []yy;
}

下面是主函数
#include "test.h"

using namespace std;

int main()
{
int i,j;
Neuralnet test(4,5,3);
int row = 3;  
int col = 4;  
double ** array2D = new double*[row];  
for(i = 0; i < row; i++)  
array2D[i] = new double[col];  
for(i = 0; i < row; i++)   
for(j = 0; j < col; j++)  
array2D[i][j] = i+j; 
test.Calculate(array2D);
test.display();
test.shanchu();

for(int i = 0; i < row; i++){  
delete[] array2D[i];  
}  
delete []array2D;
return 0;
}


我按照网上给定的方法进行二维数组的动态分配和删除

动态分配的时候没有问题,但是在删除的时候,二维数组的里层 delete[] Input[i];没问题,执行到delete[] Input;的时候运行的时候报错,无法执行~~~,同样的代码在主函数中运行就没有这样的问题!
为了解决问题,我拿一维数组测试,就不存在类似的问题。。。。无解啊
求教大神们,在编写的时候是不是有些问题。
二维数组 C++

------解决方案--------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。

------解决方案--------------------

单看这两段代码没有什么问题,应该是调用chanchu之前有过越界写访问,或者n_Case被改变了(变大),从而导致前面的释放代码越界,所以才导致delete失败。也有可能是某段代码改变了Input指针的值。
delete失败常见原因有:
1:被释放的内存块发生过越界写访问,破坏了内存块信息。
2:其它操作破坏了堆信息
3:内存块地址被改变了。
4:被释放的对象的析构函数中发生上述问题。本例中对象为double,不存在这种问题。

此外
delete[]yy;

这一句既然不在析构函数中,那么删除之后应该置为NULL,删除之前应判断。

实际上你的实现更象“数组的数组”,相当于Pascal中的array of array of double,而不是array [0..m_nCase-1, 0..m_nInput] of double这种标准的二维数组。