2017-01-12 4 views
0

Что может вызвать утечку памяти на C++, кроме использования нового ключевого слова для назначения памяти? У меня есть проект, и по всей видимости, есть несколько утечек памяти, но я не использовал новое ключевое слово один раз. Кроме того, когда я случайно оставил его в течение нескольких часов (4-6), я вернулся, чтобы увидеть, что он медленно глотал циклы процессора тоже. Не уверен, что это было бы прямым результатом утечки памяти (этим что он использует почти всю мою доступную память), так как это не происходит, когда снова запускается программа, но утечки памяти. Спасибо!Что может вызвать утечку памяти, кроме использования нового? (C++)

+4

Вы не можете напрямую называть 'new' самостоятельно, но функции, которые вы вызываете от другой стороны. Мы не можем знать без кода. –

+1

Для отладки утечек памяти вы можете использовать Valgrind. – ks1322

ответ

1

Это может быть различные вещи, как

  • постоянно растущий список, как добавление к vector и никогда не удаляя
  • Забыв закрыть открытые ресурсы, такие как дескрипторы файлов, сокетов и т.д.
  • A утечка памяти в библиотеке третьей стороны
  • Циклических ссылки, если вы являетесь ссылками подсчета
0

Существует множество способов пережевывать процессор и память.

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

Струны являются неожиданностью для использования памяти на удивление часто - если вы читаете большой объем данных рядом с началом программы (например, конфигурацию XML и т. Д.), И не позволяйте этому выйти из сферы действия, он будет висели вокруг программы заканчивается, даже если вы прямо не вызывали new. Ручки для хранения открыты, например. соединения с базами данных, файлы и т. д. также будут потреблять ресурсы.

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

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

0
  • Использование malloc, realloc или calloc или конкретные функции распределения платформы как mmap и потери возвращенный указатель.
  • Использование функции (возможно, конструктора), которая сама выделяет память, но не вызывает функцию освобождения от копирования. Например, вызывая SDL_Init без звонка SDL_Quit.
  • Использование стороннего кода, который утечки памяти, даже если используется правильно.

 Смежные вопросы

  • Нет связанных вопросов^_^