C ++: Когда мне нужно подумать о возможных утечках памяти? - PullRequest
2 голосов
/ 04 ноября 2010

Могу ли я с моим собственным кодом в C ++ случайно вызвать утечки памяти без использования функции new и malloc? (и все другие функции stdlib, которые выделяют память)

Ответы [ 6 ]

8 голосов
/ 04 ноября 2010

Если вы ничего не выделяете в куче, то в общем случае вам не придется беспокоиться об утечках памяти.

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

3 голосов
/ 04 ноября 2010

Вы не должны использовать malloc в C ++.

Вам нужно беспокоиться об управлении памятью всякий раз, когда вы пытаетесь вручную управлять динамической (выделенной с помощью new) памятью, независимо от того, выделяете ли вы ее самостоятельно или получаете ее, вызывая какую-то функцию.(Документация функции должна указывать, нужно ли вам освобождать все, что она возвращает, и какой метод для этого нужно использовать.)
Более того, вам нужно беспокоиться о каждом ресурсе вы приобретаете, будь то память, открытые файлы, заблокированные мьютексы или что-то еще.Вам не нужно беспокоиться, когда вы используете такие методы, как RAII .

Многие ресурсы (строки, массивы и другие контейнеры, файлы и т. Д.) Уже включены в классы RAII.Используйте их и больше заботьтесь о своих алгоритмах, а не о деталях управления ресурсами.

1 голос
/ 04 ноября 2010
  • _strdup в CRT создает буфер, который следует удалить с помощью free.
  • Есть некоторые функции Windows SDK, которые могут создавать буферы, которые вы должны удалить. FormatMessage может создать буфер, который следует удалить с помощью LocalFree.
  • Если вы поймаете структурированные исключения и предотвратите раскручивание стека, то память может вытечь.
  • Если вы запустите поток и не дадите ему завершиться должным образом до завершения основного потока, произойдет утечка памяти (в конце срока службы приложения, но это все еще утечка).
0 голосов
/ 09 июля 2016

Нет.Если вы не выделяете память, вы не можете утечь ее.

Как правило, если вам нужно выделение памяти с использованием 'new' или 'malloc', RAII предлагает классам явно владеть этой памятью и очищать ее вдеструктор.

class blah {
  public:
    blah(): thing(null) { thing = new thing(); }
    ~blah() { delete thing; }
  private:
    thing *thing;
};

Если вам действительно нужно динамическое выделение памяти (не принадлежит явно), используйте unique_ptr.

void func() {
  std::unique_ptr<W> because(new thing);
  because->because();
}
0 голосов
/ 04 ноября 2010

Это сложно без выделения памяти кучи (что и делают malloc и new), но не невозможно.Допустим, вы разрабатывали игру.

void playGame()
{
    ...
    showResults();
}

void showResults()
{
    ...
    if (playAgain)
        playGame();
    else
        exit(0);
}

В этом примере стек продолжает расти, пока пользователь продолжает играть снова.Если пользователь выбирает воспроизведение снова, вызывается функция playGame, но поскольку showResults не возвращается, исходное playGame также не возвращается, поэтому все созданные в стеке переменные все еще существуют.Новый экземпляр playGame создает новые копии этих переменных.Если игрок продолжает играть снова и снова, вы можете исчерпать пространство стека.Технически это нельзя назвать утечкой памяти, но это похоже.Память, которую вы используете, не освобождается.

0 голосов
/ 04 ноября 2010

Память в куче выделяется только с такой функцией / оператором (или другими не-функциями).

Конечно, если вы используете какую-то нестандартную функцию, она может выделить память в куче. Если они не прослушиваются, они должны позаботиться об удалении своих материалов или явно указать в документации, что вызывающая функция будет владеть выделенными данными.

...