C++ 类中的二维数组动态分配有关问题
C++ 类中的二维数组动态分配问题
这是目前学习测试的一段小代码,麻烦高手看看问题:
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;的时候运行的时候报错,无法执行~~~,同样的代码在主函数中运行就没有这样的问题!
为了解决问题,我拿一维数组测试,就不存在类似的问题。。。。无解啊
求教大神们,在编写的时候是不是有些问题。
------解决方案--------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
判断是否越界访问,可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断,可将数组多声明一个元素,并设置数据读写断点在该多出元素对应的地址上。
------解决方案--------------------
单看这两段代码没有什么问题,应该是调用chanchu之前有过越界写访问,或者n_Case被改变了(变大),从而导致前面的释放代码越界,所以才导致delete失败。也有可能是某段代码改变了Input指针的值。
delete失败常见原因有:
1:被释放的内存块发生过越界写访问,破坏了内存块信息。
2:其它操作破坏了堆信息
3:内存块地址被改变了。
4:被释放的对象的析构函数中发生上述问题。本例中对象为double,不存在这种问题。
此外
这一句既然不在析构函数中,那么删除之后应该置为NULL,删除之前应判断。
实际上你的实现更象“数组的数组”,相当于Pascal中的array of array of double,而不是array [0..m_nCase-1, 0..m_nInput] of double这种标准的二维数组。
这是目前学习测试的一段小代码,麻烦高手看看问题:
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这种标准的二维数组。