Может ли это быть утечка памяти? - PullRequest
0 голосов
/ 28 апреля 2019

Вызывает ли утечка памяти при использовании новой, а затем нулевой настройки?

Я пробовал следующий код, но понятия не имею, вызывает ли он какую-либо утечку или нет

#include <iostream>

using namespace std;

int main()
{

   int* x = new int;
   int y = 1;
   x = &y;

   x = nullptr; // has the memory allocated to x gone now?

   x =&y;       // did i recover what was lost?

   delete x;   

   return 0;
}

// Cout << * x дает 1, как ожидалось </p>

Ответы [ 2 ]

4 голосов
/ 28 апреля 2019

Да, это утечка. Однако утечка не возникает, когда вы присваиваете nullptr для x, а скорее в строке перед ней:

x = &y;

x теперь указывает на адрес y, и никаких других ссылок на память, выделенную вами new int, не существует. Без каких-либо ссылок на эту память невозможно освободить ее.

1 голос
/ 28 апреля 2019

Указанный на объект теряется при назначении единственного указателя, который его содержит. Как указано выше, x = &y уже теряет ваш new int. Ничто из того, что вы делаете потом, не может вернуть его обратно. Это означает, что delete вызывает неопределенное поведение и может привести к сбою вашей программы.

Однако в C ++ существует механизм, позволяющий избежать таких утечек памяти: Smart Pointers.

В C ++ интеллектуальные указатели бывают двух основных разновидностей ::std::unique_ptr<T> и ::std::shared_ptr<T>. У них есть задача удерживать объект в динамической памяти и обязательно удалять его, когда он становится неподходящим:

::std::unique_ptr<int> x = ::std::make_unique<int>(0);
x = nullptr; // automatically deletes the previously allocated int

Это немного дороже, чем необработанные указатели, но менее подвержено утечкам памяти. Умные указатели живут в заголовке <<a href="https://en.cppreference.com/w/cpp/header/memory" rel="nofollow noreferrer"> memory >.

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