我有一个函数,它在c ++中返回一个2D数组,如下所示
float** Input_data(float** train_data, int Nv, int N){
float** x_train=new float*[Nv];
int a = 0,b = 0;
for(a = 1;a<= Nv;a++){
x_train[a] = new float[N+1];
for(b = 1; b <= N+1; b++){
if(b == 1){
x_train[a][b] = 1;
}else{
x_train[a][b] = train_data[a][b-1];
}
}return x_train;}
上面代码的目的是在第一列中添加一些,并将train_data指针中的剩余数据添加到x_train中。在处理和使用x_train后,我试图按如下方式解除分配x_train
void destroyx_array(float**x_train,int Nv){
for (int free_x = 1;free_x <= Nv;free_x++){
delete[] x_train[free_x];}delete[] x_train;}
并按如下方式调用destroy函数
destroyx_array(x_train,Nv)
Input_data函数工作正常,但是当我尝试destroy_x_array它给我双重免费或腐败(out)中止(核心转储)任何人都可以解释我在做什么错?谢谢
简而言之,您的代码会破坏内存。最好的方法是不使用原始指针,而是使用容器类,如std::vector
。
话虽如此,为了修复你当前的代码,问题是你写的超出了内存的界限:
for(a = 1;a<= Nv;a++)
当a == Nv
,你正在写一个超出分配的“行”。这看起来像是试图伪造基于1的数组的表现。 C ++中的数组从0开始,而不是1.尝试伪造基于1的数组总是会导致错误和内存损坏。
修复是将函数重写为从0而不是1开始,并确保循环迭代到n-1
,其中n
是总行数:
for (a = 0; a < Nv; ++a)
上面代码的目的是在第一列中添加一些,并将train_data指针中的剩余数据添加到x_train中
您可以通过简单地使用memcpy
来简化此操作,而不是您编写的用于测试第一列的循环:
for (int i = 0; i < Nv; ++i)
{
x_train[i][0] = 1;
memcpy(&x_train[i][1], &train_data[i][0], N * sizeof(float));
}
因此整个函数看起来像这样:
float** Input_data(float** train_data, int Nv, int N)
{
float** x_train=new float*[Nv];
for(int a = 0; a < Nv; a++)
x_train[a] = new float[N+1];
for (int a = 0; a < Nv; a++)
{
x_train[i][0] = 1;
memcpy(&x_train[i][1], &train_data[i][0], N * sizeof(float));
}
return x_train;
}