Почему в следующем коде C ++ есть утечка памяти? - PullRequest
5 голосов
/ 13 февраля 2020

Предположим, класс с именем Ve c существует с вектором с именем arr, поскольку он является единственным членом. Следующий код НЕ дает утечки памяти. (Это означает, что мой деструктор для Ve c работает должным образом.)

int main() {
    Vec *obj = new Vec(5); // initializes a vector of size 5
    delete obj;
}

Однако в следующем коде означает утечка памяти. Но почему? Кажется, у меня есть delete для каждого использования new. Чего мне не хватает?

int main() {
    Vec* obj;
    obj = new Vec(5);

    if (true) {
        delete obj;
        Vec* obj = new Vec(6);
    }

    delete obj;
}

PS: я проверил на утечку памяти, используя valgrind.

Ответы [ 4 ]

10 голосов
/ 13 февраля 2020

Scope.

Vec* obj = new Vec(6); создает новую переменную с именем obj, которая существует только в теле if и скрывает obj во внешней области видимости. Внутренний obj выходит из области видимости и исчезает в конце тела if, беря последний указатель на это новое выделение. Затем код повторно delete s obj во внешней области ( не очень хорошая вещь, чтобы сделать ).

Решение:

int main() {
    Vec* obj;
    obj = new Vec(5);

    if (true) {
        delete obj;
        obj = new Vec(6); // re-uses the original obj
    }

    delete obj;
}
2 голосов
/ 13 февраля 2020

Объект Ve c*, объявленный внутри условия if, находится в другой области видимости. Вы делаете другое удаление вне области, которая указывает на объект Ve c*, который вы объявили в начале функции main (). Следовательно, массив Ve c выделяется внутри, если условие - утечка памяти

1 голос
/ 13 февраля 2020

Удаление «Ve c*» в условном выражении исправит утечку памяти. Вы определяете новый указатель типа Ve c (который также называется obj) внутри условного и никогда не освобождаете эту память. Оба «delete» ссылаются на первый «obj», так как второй «obj» выходит из области видимости, не удаляясь в конце условия.

1 голос
/ 13 февраля 2020

Когда вы снова говорите Vec* obj =, вместо obj =, вы заменяете старую переменную вместо ее обновления. В результате вы пропускаете второе obj, а еще хуже, вы дважды освобождаете первое.

...