Утечка памяти после удаления [] - PullRequest
1 голос
/ 09 октября 2019

У меня проблема с утечкой памяти, и я не могу понять, что может быть причиной. У меня есть структура, которая содержит массив. Иногда мне нужно изменить размер массива, поэтому я создаю новый массив, который в два раза длиннее старого массива, и копирую все старые значения. Затем я удаляю массив с помощью «delete [] array» и переназначаю старый массив новым массивом.

struct Structure {
    double* array = new double[1]
    int capacity = 1;
}

void resize (Structure& structure) {
    double* array = new double[structure.capacity * 2];
    for (int i = 0; i < structure.capacity; i++) {
        array[i] = structure.array[i];
    }
    delete [] structure.array;
    structure.array = array;
}

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

==91== 16 bytes in 1 blocks are definitely lost in loss record 1 of 1
==91==    at 0x4C3089F: operator new[](unsigned long)

1 Ответ

3 голосов
/ 09 октября 2019

Ваша структура не следует правилу 3/5/0 , в частности, отсутствует деструктор для delete[] текущего array при разрушении самой структуры:

struct Structure {
    double* array = new double[1];
    int capacity = 1;

    ~Structure() { delete[] array; } // <-- add this!

    /* also, you should add these, too:
    Structure(const Structure &)
    Structure(Structure &&)
    Structure& operator=(const Structure &)
    Structure& operator=(Structure &&)
    */
};

Вы действительно должны использовать std::vector<double> вместо использования new[] напрямую. std::vector обрабатывает все, что вы пытаетесь сделать вручную, и делает это безопаснее, чем вы:

#include <vector>

struct Structure {
    std::vector<double> array;

    Structure() : array(1) {}
};

void resize (Structure& structure) {
    structure.array.resize(structure.array.size() * 2);
}

Или:

#include <vector>

struct Structure {
    std::vector<double> array;

    Structure() { array.reserve(1); }
};

void resize (Structure& structure) {
    structure.array.reserve(structure.array.capacity() * 2);
}

В зависимости от того, как вы на самом деле используете array.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...