Детекторы утечки памяти для C?

Список файлов, которые были изменены в commit:

git diff --name-only SHA1^ SHA1

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

30
задан 6 revs, 3 users 35% 23 May 2017 в 11:46
поделиться

13 ответов

второй valgrind... и я добавлю электрический забор .

17
ответ дан nlucaroni 23 May 2017 в 11:46
поделиться
  • 1
    Используйте BigDecimal.ZERO вместо того, чтобы воссоздать колесо. Кроме того, doubleValue() вызов побеждает всю цель этого осуществления путем отбрасывания произвольной точности. – EntangledLoops 2 October 2015 в 14:22

В университете, когда я делал большинство вещей под Unix Солярис, я использовал gdb.

Однако я пошел бы с valgrind в соответствии с Linux.

0
ответ дан Marcel 23 May 2017 в 11:46
поделиться
  • 1
    попробуйте BigDecimal.valueOf (123.123123123*123.123123123), он дает забавный результат – Ilya Gazman 25 January 2015 в 01:25

Болезненный, но если необходимо было использовать тот..
я рекомендовал бы комплект DevPartner BoundsChecker .. это - то, что люди на моем рабочем месте используют с этой целью. Заплаченный n собственный.. не бесплатное программное обеспечение.

2
ответ дан David L. 23 May 2017 в 11:46
поделиться
  • 1
    Спасибо, этот ответ описывает в значительной степени, что мы закончили тем, что делали, особенно PGO оказался довольно полезным. Дополнительно мне также понравился проект ACOVEA, предложенный @zaufi, хотя это didn' t удаются для этого проекта. – Haatschii 14 August 2016 в 23:13

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

2
ответ дан Thomas Owens 23 May 2017 в 11:46
поделиться
  • 1
    Ничего себе, didn' t знают об опциях PGO! Приблизительно 30%-е улучшение моего случая. – fhucho 31 December 2016 в 22:19

Valgrind в соответствии с Linux довольно хорош; у меня нет опыта в соответствии с Windows с этим.

11
ответ дан Edgard Leal 23 May 2017 в 11:46
поделиться
  • 1
    @Haatschii Да, I' m извините я can' t непосредственно отвечают на Ваш вопрос (т.е. как сжать большинство из GCC), вызовите I don' t думают, что Вы можете. Я просто думал, что будет стоить поместить те немного точек там (использующий ICC и делающий оптимизацию памяти) как лучшие проспекты для фактического достижения цели. – Mikael Persson 24 January 2013 в 02:44

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

"куча" Отладки GlowCode

1
ответ дан 1800 INFORMATION 23 May 2017 в 11:46
поделиться

Дедушка этих инструментов является коммерческим, закрытым исходным кодом инструмент Purify , который был продан IBM, и затем Parasoft UNICOM

Обеспечивают ++ (инструментарий исходного кода), и valgrind (открытый исходный код) являются двумя другими настоящими конкурентами.

Мелочи: исходный автор Очищает, Reed Hastings, переходил к найденному Netflix.

0
ответ дан djsadinoff 23 May 2017 в 11:46
поделиться
  • 1
    Это, конечно, делает... 123.1231231229999988908297926818176540649... Однако при выполнении умножения Вы добираетесь 15159.303447561417273129..... использование String, конструктор для BigDecimal действительно приводит к корректному ответу. bigSqrt(new BigDecimal("15159.303447561417273129")) = 123.1231231230000000000000000000000000... я предполагаю, что это - проблема с Double к BigDecimal удобный метод конструкции а не sqrt алгоритма. – haventchecked 27 January 2015 в 00:50

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

, Почему использование уже записанный код, когда можно записать собственное:)

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

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

-1
ответ дан Alan H 23 May 2017 в 11:46
поделиться
  • 1
    Обратите внимание что A.doubleValue () = NaN для более крупного BigDecimals. Используя (говорят) A.divide (ДВА, RoundingMode. ПОЛ), позволит этой работе с большими значениями. – MZB 18 May 2014 в 22:54

Для отладки Win32 утечек памяти у меня был очень хороший опыт с простой "кучей" Отладки CRT, которая стала lib с Визуальным C.

В Отладочная сборка malloc (и др.) переопределена как _malloc_dbg (и др.) и существуют другие вызовы для получения результатов, которые все не определены, если _DEBUG не установлен. Это настраивает все виды граничной защиты на "куче" и позволяет Вам diplay результаты в любое время.

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

я должен был произвести первый DOS, затем консоль Win32 и сервисы, которые будут работать навсегда. Насколько я знаю, что нет никаких утечек памяти, и в по крайней мере одном помещают код, выполненный в течение двух лет, необслуживаемых перед монитором на отказавшем ПК (хотя ПК был прекрасен!).

1
ответ дан David L Morris 23 May 2017 в 11:46
поделиться

Если у Вас есть деньги: Рациональная IBM Очищает , чрезвычайно мощная утечка памяти промышленной силы и детектор повреждения памяти для C/C++. Существует для Windows, Соляриса и Linux. Если Вы только для Linux и хотите дешевое решение, пойдите для Valgrind.

3
ответ дан Thorsten79 23 May 2017 в 11:46
поделиться
  • 1
    Причины мы don' t (все же) используют компилятор Intel, то, что он не поддерживает определенный C++ 11 функций, которые мы используем. Если это изменится достаточно скоро, то мы попробуем ICC также. Я главным образом согласовываю с Вами вторую часть. Но кроме разрешения дальнейшим людям взглянуть на код, я don' t видят, как мы можем далее улучшить его. Поэтому мой вопрос состоял в том, если существует больше вещей, мы можем заставить компилятор сделать. – Haatschii 24 January 2013 в 02:30

В Windows я использовал Визуальный Детектор Утечки . Интегрируется с VC ++, простой в использовании (просто включают заголовок и устанавливают LIB для нахождения lib), открытый исходный код, бесплатный использовать FTW.

1
ответ дан David L. 23 May 2017 в 11:46
поделиться
  • 1
    Смысл использования BigDecimal должен достигнуть высокой точности. – user1613360 28 July 2014 в 23:35

Брызговик для gcc! Это на самом деле компилирует проверки в исполняемый файл. Просто добавьте

-fmudflap -lmudflap

к Вашим флагам gcc.

3
ответ дан Artelius 23 May 2017 в 11:46
поделиться
  • 1
    " Они не включены в-Ofast" я вполне уверен, который является неправильным. При рассмотрении документов GCC для - ffast-математика (включенный-Ofast), это также включает-funsafe-math-optimizations, который включает - fassociative-математика. (среди других) существует фраза в документах " Эта опция не включена никаким-O option" то, что я рассматриваю ошибку в документации, так как-Ofast действительно включает их. Кроме того, PGO включают - funroll-циклы, который включает - frename-регистры. – uLoop 2 January 2018 в 22:57

Также стоящий использования, если Вы находитесь на Linux с помощью glibc, встроенный код "кучи" отладки. Чтобы использовать его, свяжитесь с -lmcheck или определить (и экспорт) MALLOC_CHECK _ переменная среды со значением 1, 2, или 3. glibc руководство предоставляет больше информации.

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

2
ответ дан Ben Combee 23 May 2017 в 11:46
поделиться
  • 1
    Хороший для знания! Я обновлю свой ответ соответственно. – Pyves 15 August 2016 в 22:37
Другие вопросы по тегам:

Похожие вопросы: