причина утечки памяти в C C ++ - PullRequest
6 голосов
/ 15 декабря 2010

каковы причины утечки памяти в C C ++ (кроме обычного выделения памяти и забудьте об ее освобождении)

Ответы [ 8 ]

17 голосов
/ 15 декабря 2010

Если между выделением и освобождением возникает исключение, происходит утечка памяти.

void f1() {
    int* ptr = new int;

    // do something which may throw an exception

    // we never get here if an exception is thrown
    delete ptr;
}

Каждый раз, когда f1 завершается с исключением, происходит утечка 4 байтов (при условии int - 4 байта).

14 голосов
/ 15 декабря 2010

Утечка памяти возникает, когда вы выделяете память, еще не освободили ее, и вы никогда не сможете ее освободить, потому что больше не можете получить к ней доступ .

Например, следующий код вызывает утечку памяти размером sizeof(int):

int * a = malloc(sizeof(int)); //allocate memory
a = 0; //this will cause a memory leak

Это создает утечку памяти, потому что теперь мы никогда не сможем освободить память, выделенную для a.

6 голосов
/ 15 декабря 2010

Вы также можете потерять память, если не освобождаете какой-либо другой ресурс, например, не вызываете fclose для FILE * или некоторого другого дескриптора библиотеки, потому что они могут выделять буферы памяти, которые не доступны непосредственно вашей программе.

4 голосов
/ 15 декабря 2010

Допустим, вы создали класс, который наследует какой-то другой класс, у которого нет виртуального деструктора.Если тип указателя на этот класс не является самым производным классом (это обычно происходит, если вы используете абстрактную фабрику), тогда будет вызываться только деструктор из типа указателя, и все, что вы надеялись, освободит в наиболее производномДеструктор класса будет иметь утечку.

Это очень распространенная ошибка, которую иногда трудно увидеть.

В любом случае, если вы хотите избежать утечек памяти в C ++, следуйте этим правилам:

  • Предпочитают проходящие ссылки, а не указатели
  • По возможности используйте умный указатель (см .: shared_ptr )
2 голосов
/ 15 декабря 2010

Нет другой причины утечки памяти, кроме той, которую вы упомянули

2 голосов
/ 15 декабря 2010

A new без delete, new[] без delete[], malloc без free.

Серьезно, что еще ты хочешь услышать?

1 голос
/ 01 января 2014

Я удивлен, что никто еще не упомянул повреждение памяти.

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

Какой-то парень испортилувеличение размера, что приводит к копированию данных всего на пару байтов сверх максимального размера блока (указатели были только 2 байта длиной :)).Затем он перезапишет «следующую» ссылку, расположенную в начале следующего свободного блока, мусором, который оказался заполнен нулями.

Это привело к разрыву цепочки свободных блоков.Поскольку в этот момент другие части программного обеспечения поддерживали свои собственные указатели на те блоки, которые они использовали, программа, казалось, работала просто отлично.

Но, конечно, список время от времени заканчивался несколькими блоками,и эта утечка в конечном итоге исчерпала свободные блоки, из-за чего приложение умерло от голода.

0 голосов
/ 05 мая 2014

Следующий пример, написанный в псевдокоде, предназначен для того, чтобы показать, как может происходить утечка памяти и ее последствия без каких-либо знаний в области программирования. Программа в данном случае является частью очень простого программного обеспечения, предназначенного для управления лифтом. Эта часть программы запускается всякий раз, когда кто-либо внутри лифта нажимает кнопку для пола.

При нажатии кнопки:

  Get some memory, which will be used to remember the floor number
  Put the floor number into the memory
  Are we already on the target floor?
    If so, we have nothing to do: finished
    Otherwise:
      Wait until the lift is idle
      Go to the required floor
      Release the memory we used to remember the floor number

Утечка памяти произошла бы, если запрошенный номер этажа совпадает с этажом, на котором работает лифт; условие освобождения памяти будет пропущено. Каждый раз, когда это происходит, происходит утечка памяти.

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