在c ++中释放内存时双重释放或损坏(out)

问题描述 投票:-1回答:1

我有一个函数,它在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)中止(核心转储)任何人都可以解释我在做什么错?谢谢

c++ memory memory-management
1个回答
1
投票

简而言之,您的代码会破坏内存。最好的方法是不使用原始指针,而是使用容器类,如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;
} 
© www.soinside.com 2019 - 2024. All rights reserved.