удвоит бесплатно или коррупции (уходит), а память в deallocating C++

Вопрос задан: 9 месяцев назад Последняя активность: 9 месяцев назад
up -1 down

У меня есть функция, которая возвращает массив 2D в C++ следующим образом

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;}

и вызов функции уничтожения следующим

destroyx_array(x_train,Nv)

функции Input_data работает нормально, но когда я пытаюсь destroy_x_array это дает мне двойной бесплатно или повреждение (уходит) прервана (ядро сбрасывали) может кто-нибудь объяснить, что не так я делаю? благодарю вас

1 ответ

Возможно, для Вашего проекта будут необходимы бесплатные векторные карты. На нашем сайте представлены карты для всех стран.

Реклама

up 1 down accepted

Проще говоря, ваш код развращает памяти. Лучше всего, чтобы не использовать сырые указатели и вместо того, чтобы использовать контейнерные классы, такие как 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;
}