Как проигнорировать ложные положительные утечки памяти от _CrtDumpMemoryLeaks?

Это кажется каждый раз, когда существуют статические объекты, _CrtDumpMemoryLeaks возвращает ложное положительное утверждение, что это пропускает память. Я знаю, что это вызвано тем, что они не становятся уничтоженными до окончания основного () (или WinMain) функция. Но есть ли какой-либо способ избежать этого? Я использую VS2008.

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

4 ответа

Это позволяет избежать закольцовывания:

int tmp = a % b;
if (tmp < 0) tmp += b;

Обратите внимание, что и a, и b должны быть подписаны.

-121--2088770-

Я наконец-то разобрался. Я использовал Sandbox с профилем подготовки AdHoc. Ad Hoc, очевидно, рассматривается как производство, а не как разработка. Я создал сертификат производства push, установил его и вуаля! Работает.

-121--3774686-

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

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

2
ответ дан 3 December 2019 в 07:37
поделиться

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

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

Jacob

0
ответ дан 3 December 2019 в 07:37
поделиться

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

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

Я не думаю, что это правильно. РЕДАКТИРОВАТЬ: Статические объекты не создаются в куче. КОНЕЦ РЕДАКТИРОВАНИЯ: _CrtDumpMemoryLeaks охватывает только память кучи crt. Следовательно, эти объекты не должны возвращать ложные срабатывания. Однако другое дело, если статические переменные являются объектами, которые сами содержат некоторую память кучи (если, например, они динамически создают объекты-члены с помощью оператора new () ).

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

1
ответ дан 3 December 2019 в 07:37
поделиться

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

0
ответ дан 3 December 2019 в 07:37
поделиться
Другие вопросы по тегам:

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