Как найти утечки памяти в исходном коде

Это - в основном более значимое местоположение для ресурса. Используя идентификатор совершенно допустимо, но это значит больше для машин, чем люди.

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

т.е.:

/2008/sept/06/why-some-websites-add-slugs-end-of-urls/

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

/2008/sept/06/why-some-websites-add-slugs-end-of-urls/
/2008/sept/06/why-some-websites-add-slugs-end-of-urls-1/
/2008/sept/06/why-some-websites-add-slugs-end-of-urls-2/

Много алгоритмов краткого заголовка также избавляется от общих слов как и "a" для помощи в хранении короткого URL. Этот ограниченный по объему подход также делает его очень простым для нахождения всех ресурсов в течение данного дня, месяца или года - Вы просто обрубаете сегменты.

Кроме того, stackoverflow URL плохи в том смысле, что они представляют дополнительный сегмент для показа краткого заголовка, который является нарушением идеи, что каждый сегмент должен представить убывание иерархии ресурса.

8
задан Ankur 14 December 2009 в 05:34
поделиться

9 ответов

Есть valgrind и, возможно, другие отличные инструменты. Но я скажу вам, что я делаю, это очень хорошо работает для меня, учитывая, что я много раз кодирую в средах, где вы не можете запустить valgrind:

  • Убедитесь, что каждое выделение памяти связано с освобождением. Я всегда считаю новости или маллоки и ищу удаление или освобождение.
  • Если в C ++ и используются исключения, попробуйте поместить их в пары в конструкторы / деструкторы. Если вам нравится риск или вы не можете поместить их в Ctor / dtor, убедитесь, что никакое исключение не может заставить поток программы не выполнять освобождение.
  • Использование интеллектуальных указателей и контейнеров ptr.
  • Можно контролировать alloc / dealloc переписывает новый или устанавливает обработчик malloc. В какой-то момент, если код работает непрерывно, может быть очевидно, что использование памяти становится стационарным и не растет без ограничений, что было бы наихудшим случаем утечки.
  • Будьте осторожны с контейнерами, которые никогда не сжимаются, такими как векторы. Есть уловки, чтобы уменьшить их, заменив их пустым контейнером.
9
ответ дан 5 December 2019 в 05:19
поделиться

Purify, казалось бы, чудесно справится с этой задачей

Не только утечки памяти, но и многие другие виды ошибок памяти.

Он работает путем инструментирования вашего машинного кода в реальном времени, так что вам не нужен исходный код или необходимость компилировать с какими-либо конкретными параметрами.

Просто настройте свой код с помощью Purify (самый простой способ сделать это: CC = "purify cc" make ), запустите вашу программу , и получите красивый графический интерфейс, который покажет ваши утечки и другие ошибки.

Доступно для Windows, Linux и различных разновидностей Unix. Доступна бесплатная пробная загрузка.

http://www.ibm.com/software/awdtools/purify

4
ответ дан 5 December 2019 в 05:19
поделиться

Существует два основных метода обнаружения утечек памяти: динамический и статический анализ.

В динамическом анализе вы запускаете код, а инструмент анализирует выполнение, чтобы увидеть, какая память просочилась в конец. Динамический анализ имеет тенденцию быть очень точным, но будет правильно анализировать только те конкретные действия, которые вы выполняете в своем инструменте. Итак, если некоторые из ваших утечек происходят только для определенных входных данных, и у вас нет теста, использующего эти входные данные, динамический анализ не обнаружит эти утечки.

Статический анализ анализирует исходный код для создания всех возможных путей кода и посмотрите, может ли произойти утечка в любом из них. Хотя статический анализ сейчас довольно хорош, он не идеален - вы можете не только получить ложноотрицательные результаты (анализ пропускает утечки), вы также можете получить ложные срабатывания (инструмент утверждает, что у вас есть утечка, хотя на самом деле ее нет).

Существует множество инструментов динамического анализа, включая такие хорошо известные инструменты, как Valgrind (открытый исходный код, но ограниченный для x86 Linux и Mac) и Purify (коммерческий, но также доступен для Windows, Solaris и AIX). В Википедии есть приличный список некоторых других инструментов динамического анализа .

Что касается статического анализа, единственный инструмент, который я считаю стоящим, - это Coverity (коммерческий). И снова в Википедии есть список многих других инструментов статического анализа .

Существует множество инструментов динамического анализа, включая такие хорошо известные инструменты, как Valgrind (с открытым исходным кодом, но только для x86 Linux и Mac) и Purify (коммерческий, но также доступный для Windows, Solaris и AIX). В Википедии есть приличный список некоторых других инструментов динамического анализа .

Что касается статического анализа, единственный инструмент, который я считаю стоящим, - это Coverity (коммерческий). И снова в Википедии есть список многих других инструментов статического анализа .

Существует множество инструментов динамического анализа, включая такие хорошо известные инструменты, как Valgrind (с открытым исходным кодом, но только для x86 Linux и Mac) и Purify (коммерческий, но также доступный для Windows, Solaris и AIX). В Википедии есть приличный список некоторых других инструментов динамического анализа .

Что касается статического анализа, единственный инструмент, который я считаю стоящим, - это Coverity (коммерческий). И снова в Википедии есть список многих других инструментов статического анализа .

7
ответ дан 5 December 2019 в 05:19
поделиться

Очистку также можно использовать для обнаружения утечки памяти.

0
ответ дан 5 December 2019 в 05:19
поделиться

Общих рекомендаций по поиску утечек памяти не так много. К счастью, есть одно простое руководство для предотвращения большинства утечек, как памяти, так и других ресурсов: используйте RAII (Resource Acquisition Is Initialization), и они просто не начнутся. Имя - паршивая характеристика, но если вы введете его в Google, вы получите немало полезных результатов.

0
ответ дан 5 December 2019 в 05:19
поделиться

Лично я бы порекомендовал вам обернуть все переменные, которые вам нужны для выделения / освобождения памяти, классом clone_ptr , который выполняет все освобождение памяти за вас, когда это необходимо. больше не нужен. Таким образом, вам не нужно использовать удалить . Он очень похож на auto_ptr . Основное отличие состоит в том, что вам не нужно иметь дело с сложной частью передачи права собственности. Дополнительную информацию и код на clone_ptr можно найти здесь .

0
ответ дан 5 December 2019 в 05:19
поделиться
  1. скомпилируйте ваш код с флагом -g
  2. Загрузите valgrind (если вы работаете в Linux) и запустите его с параметром --leak-check = yes

Я думаю, что valgrind - это лучший инструмент для этой задачи.

Для Windows: См. этот раздел: Есть ли хороший заменитель Valgrind для Windows?

12
ответ дан 5 December 2019 в 05:19
поделиться

Что касается ручного выполнения, я не думаю, что существует какая-либо устоявшаяся практика. Чтобы просмотреть код с помощью зубчатой ​​гребенки, ища новые с ( alloc с) без соответствующих удаляемых с ( бесплатно s), вот и все, что для этого нужно.

0
ответ дан 5 December 2019 в 05:19
поделиться

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

0
ответ дан 5 December 2019 в 05:19
поделиться