C ++ std :: утечка памяти карты [дубликат]

Из стандарта JSON :

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

(выделение мое).

Итак, нет, вы не можете гарантировать заказ.

9
задан Marlon 24 February 2010 в 04:19
поделиться

5 ответов

Ach. Если вы уверены, что _CrtDumpMemoryLeaks() лежит, то вы, вероятно, правы. Большинство предполагаемых утечек памяти, которые, как я вижу, не соответствуют требованиям _CrtDumpMemoryLeaks(). Я полностью согласен со следующим: _CrtDumpMemoryLeaks() сбрасывает все открытые дескрипторы. Но ваша программа, вероятно, уже имеет открытые ручки, поэтому обязательно вызывайте _CrtDumpMemoryLeaks() только тогда, когда все дескрипторы были выпущены. Дополнительную информацию см. В http://www.scottleckie.com/2010/08/_crtdumpmemoryleaks-and-related-fun/ .

0
ответ дан fthiella 17 August 2018 в 08:53
поделиться
  • 1
    Ссылка мертва. Кроме того, _CrtDumpMemoryLeaks не контролирует ручки. Он строго относится к блокам памяти в отладочной куче. – IInspectable 17 April 2017 в 17:58

Не является прямым решением, но в целом я счел целесообразным переместить как можно больше выделения из статического времени инициализации. Обычно это приводит к головным болям (порядок инициализации, порядок инициализации и т. Д.).

Если это слишком сложно, вы можете вызвать _CrtMemCheckpoint ( http://msdn.microsoft.com/en- us / library / h3z85t43% 28VS.80% 29.aspx ) в начале main() и _CrtMemDumpAllObjectsSince в конце.

1
ответ дан Justicle 17 August 2018 в 08:53
поделиться

Я обнаружил, что если вы скажете, чтобы он автоматически проверял память после завершения программы, он позволяет учитывать все статические объекты. Я использовал log4cxx и boost, которые делают много распределений в статических блоках, это фиксировало мои «ложные срабатывания» ...

Добавьте следующую строку вместо вызова _CrtDumpMemoryLeaks где-то в начале основного ( ):

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

Дополнительные сведения об использовании и макросах см. в статье MSDN:

http://msdn.microsoft.com/en-us/library /5at7yxcs(v=vs.71).aspx

10
ответ дан praveenster 17 August 2018 в 08:53
поделиться
  • 1
    Я по-прежнему получаю утечку памяти на этот код boost BOOST_LOG_TRIVIAL(error) << "Module: ";, настройка _CrtSetDbgFlag не помогла. У тебя есть идея? – Pritesh Acharya 25 March 2014 в 06:39

1) Вы сказали:

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

Я не думаю, что это правильно. EDIT: Статические объекты не создаются в куче. END EDIT: _CrtDumpMemoryLeaks охватывает только кучу памяти crt. Поэтому эти объекты не должны возвращать ложные срабатывания. Однако, другое дело, если статические переменные являются объектами, которые сами хранят некоторую кучную память (если, например, они динамически создают объекты-члены с помощью operator new()).

2) Рассмотрим использование _CRTDBG_LEAK_CHECK_DF, чтобы активировать утечку памяти проверьте в конце выполнения программы (это описано здесь: http://msdn.microsoft.com/en-us/library/d41t22sb (VS.80) .aspx ). Я полагаю, что проверка утечки памяти выполняется даже после завершения статических переменных.

1
ответ дан Stefan Hubert 17 August 2018 в 08:53
поделиться
  • 1
    Статические объекты не выделяются в стеке. – Billy ONeal 8 April 2010 в 15:04
  • 2
    @Billy: спасибо за вашу коррекцию ... предположим, что вы правы. Однако, они тоже не распределены на куче, не так ли? – Stefan Hubert 8 April 2010 в 15:21
  • 3
    Надеюсь, теперь вы, ребята, выяснили, где хранятся статические объекты. – Krum 17 February 2016 в 16:26

Можете ли вы сделать снимок выделенных в настоящее время объектов каждый раз, когда вы хотите получить список? Если это так, вы можете удалить первоначально выделенные объекты из списка, когда ищете утечки, которые возникают при работе. Раньше я использовал это, чтобы найти инкрементные утечки.

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

Jacob

0
ответ дан TheJacobTaylor 17 August 2018 в 08:53
поделиться
Другие вопросы по тегам:

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