- Как найти и исправить утечки памяти в Windows 10/8/7
- Утечки памяти в Windows 10
- Предотвращение утечек памяти
- Устранение утечек памяти в Windows
- Нахождение утечек памяти с помощью библиотеки CRT Find memory leaks with the CRT library
- Включение обнаружения утечек памяти Enable memory leak detection
- Интерпретация отчета об утечке памяти Interpret the memory-leak report
- Задание точек останова для номера выделения памяти Set breakpoints on a memory allocation number
- Сравнение состояний памяти Compare memory states
- Ложные срабатывания False positives
Как найти и исправить утечки памяти в Windows 10/8/7
Утечка памяти – это неправильное размещение ресурса в компьютерной программе из-за неправильного распределения памяти. Это происходит, когда неиспользуемая область ОЗУ остается невыпущенной. Утечку памяти не следует путать с утечкой пространства, которая относится к программе, использующей больше оперативной памяти, чем необходимо. Утечка памяти в системе Windows 10/8/7, как говорят, произошла, когда память просто недоступна, несмотря на то, что она не используется.
Утечки памяти в Windows 10
Прежде чем начать, вы должны знать, что утечка памяти – это проблема программного обеспечения для отладки – например, в Java, JavaScript, C/C ++, Windows и т. Д. Физическая замена ОЗУ или жесткого диска не требуется.
Почему это плохо
Очевидно, что утечка памяти – это плохо, потому что это ошибка, недостаток в системе. Но давайте выясним, как именно это влияет на систему:
- Поскольку память не освобождается, даже когда она не используется, это приводит к ее истощению.
- Исчерпание памяти приводит к старению программного обеспечения.
- Уменьшение доступной памяти приводит к увеличению времени отклика и снижению производительности системы.
- Неконтролируемая утечка памяти может в конечном итоге привести к сбою приложения.
Чтобы идентифицировать утечку памяти, программист должен иметь доступ к исходному коду программы.
Обнаружение утечки
Чтобы решить проблему, нам нужно сначала ее идентифицировать. Основные шаги по обнаружению утечки памяти:
- Подтверждение . Определение наличия утечки.
- Поиск утечки памяти в режиме ядра . Поиск утечки, вызванной компонентом драйвера режима ядра.
- Поиск утечки памяти в пользовательском режиме . Поиск утечки, вызванной драйвером пользовательского режима или приложением.
Распределение памяти
Существуют разные режимы, в которых приложения выделяют оперативную память. Если пространство не освобождается после использования, утечка памяти будет происходить независимо от режима выделения. Некоторые общие шаблоны распределения:
- Функция HealAlloc для выделения кучи памяти. Эквивалентами времени выполнения C/C ++ являются malloc и новые.
- Функция VirtualAlloc для прямого выделения из ОС.
- Kernel32 API для хранения памяти ядра для приложения. Пример, CreateFile, CreateThread.
- User32 API и Gdi32 API.
Предотвращение утечек памяти
Мы все знаем, что профилактика лучше лечения, поэтому есть несколько способов предотвратить утечку памяти.
Мониторинг привычек
Вы должны следить за ненормальным использованием ОЗУ отдельными программами и приложениями. Вы можете перейти в диспетчер задач Windows, нажав CTRL + SHIFT + ESC и добавить такие столбцы, как дескрипторы, объекты пользователя, объекты GDI и т. Д.
Это поможет вам легко отслеживать использование ресурсов.
Инструменты Microsoft для диагностики утечек памяти
Различные инструменты диагностируют утечки памяти для различных режимов выделения:
- Верификатор приложения диагностирует утечки кучи.
- UMDH (компонент средств отладки Windows) диагностирует утечки для отдельных процессов, отслеживая выделение кучи памяти.
- Trace Capture для тщательного анализа использования оперативной памяти.
- Xperf также отслеживает шаблоны распределения кучи.
- CRT Debug Heap не только отслеживает выделение кучи, но также позволяет использовать методы кодирования для минимизации утечек.
- JavaScript Memory Leak Detector отлаживает утечки памяти в кодах.
Советы по использованию
- Используйте ядра HANDLE и другие умные указатели для ресурсов Win32 и выделения кучи.
- Получите классы для автоматического управления ресурсами для выделения ядра из библиотеки ATL. Стандарт C ++ имеет auto_ptr для распределения кучи.
- Инкапсулируйте указатели COM-интерфейса в «умные указатели» с помощью _com_ptr_t или _bstr_t или _variant_t .
- Мониторинг кода .NET на предмет ненормального использования памяти.
- Избегайте множественных путей выхода для функций, чтобы к концу функции освободить выделения из переменных в большинстве блоков.
- Используйте собственные исключения только после освобождения всех выделений в блоке _finally. Оберните всю кучу и обработайте выделения в интеллектуальные указатели, чтобы использовать исключения C ++.
- Всегда вызывайте функцию PropVariantClear перед повторной инициализацией или удалением объекта PROPVARIANT.
Устранение утечек памяти в Windows
Так же, как различные способы предотвращения утечек памяти, существуют различные способы остановить утечки памяти.
1] Закройте процессы и перезапустите.
Если вы видите, что ненужный процесс занимает слишком много ОЗУ, вы можете завершить процесс в диспетчере задач. Вам нужно будет перезагрузить устройство, чтобы освободившееся пространство было доступно для использования другими процессами. Без перезагрузки проблема утечки памяти не будет решена. Одним из конкретных процессов, которые имеют ошибки для замедления работы ПК, является Runtime Broker. Попробуйте, если отключение, которое само по себе работает.
2] Инструменты диагностики памяти
Чтобы получить доступ к встроенному инструменту диагностики памяти для Windows:
- Сохраните всю вашу важную работу.
- Нажмите Win + R , чтобы открыть окно Выполнить .
- Введите команду mdsched.exe в окне Выполнить .
- Перезагрузите компьютер.
- После перезапуска выполните базовое сканирование или выберите параметры Расширенные , например Test mix ’или Количество проходов ’.
- Нажмите F10 , чтобы начать тестирование.
Это все еще временные исправления.
3] Проверить обновления драйверов
Устаревшие драйверы вызывают утечки памяти. Держите все драйверы обновленными:
- Нажмите Win + R и откройте окно Выполнить . Введите devmgmt.msc и нажмите Enter. Вы попадете в Диспетчер устройств .
- Проверьте устаревшие драйверы и обновите их все.
- Для обновлений, которые вы могли пропустить, проверьте в Центре обновления Windows.
Это было просто.
4] Оптимизация производительности
Настройка Windows на производительность будет управлять всем, включая планирование процессора и использование памяти, чтобы предотвратить утечки памяти. Следуй этим шагам:
- Нажмите правой кнопкой мыши на Этот компьютер ’и выберите настройки Дополнительно на левой панели.
- На вкладке “ Дополнительно ” перейдите в раздел “ Эффективность “, а затем “ Настройки “.
- Установите флажок Настроить для лучшей производительности и нажмите ОК .
- Перезапустите и проверьте, решена ли проблема.
Если это простое решение не сработало, попробуйте следующее решение.
5] Отключить программы, запускаемые при запуске
Отключение проблемных программ – единственный способ избавиться от проблемы утечки памяти. Зайдите в диспетчер задач и отключите программу, создающую проблемы. Если вы не знаете, какие программы создают проблемы, сделайте следующее:
- Перейдите в Диспетчер задач .
- Перейдите в “ Запуск “.
- Отключите автозапуск программ, которые вам не нужно запускать по умолчанию.
6] Дефрагментация жесткого диска
Хотя Windows 10 делает это для вас автоматически, вам может понадобиться время от времени выполнять дефрагментацию жестких дисков для оптимизации производительности:
- Перейдите на страницу “ Этот компьютер ” или “ Мой компьютер “.
- Щелкните правой кнопкой мыши системный жесткий диск (обычно диск C:).
- Перейдите на вкладку Инструменты и выберите Свойства ‘и выберите Оптимизировать ’.
- Выберите диск для дефрагментации и выберите « Анализировать ».
Перезагрузите компьютер после новой фрагментации.
7] Файл ClearPage при завершении работы
Сейчас становится все сложнее, но не волнуйтесь. Вот как очищать файл подкачки при каждом выключении:
- Введите regedit в поле поиска, чтобы запустить редактор реестра.
- Введите этот путь: HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerMemory Management
- Измените значение ClearPageFileAtShutDown на «1».
- Сохраните изменения и перезагрузите устройство.
Это должно сделать это.
9] Отключить суперпатч
Этот сервис Windows оптимизирует производительность за счет минимизации времени загрузки. Это позволяет Windows управлять использованием оперативной памяти. Жизнь после отключения Superfetch не удобна, но сделайте это, если нужно. По крайней мере, попробуйте это в одиночку, чтобы изолировать проблему:
- Найдите services.msc и перейдите в диспетчер служб.
- Найдите Superfetch и нажмите его правой кнопкой мыши, чтобы перейти в Свойства .
- Выберите « Стоп ».
- Также Отключить ’сервис из раскрывающегося меню.
- Перезагрузите компьютер и проверьте, не улучшилась ли производительность.
Включите Superfetch, если этот не работает.
10] Проверка на наличие вредоносных программ
Используйте стороннее антивирусное программное обеспечение или встроенный в Windows 10 Защитник Windows для сканирования и устранения вредоносных программ.Убедитесь, что антивирус обновлен для поддержки вашей ОС, чтобы он не стал причиной утечки памяти.
Каждое решение, которое вам когда-либо понадобится, чтобы найти или предотвратить утечку памяти, находится здесь. Вы можете прочитать больше об утечках памяти на MSDN и Microsoft.
Нахождение утечек памяти с помощью библиотеки CRT Find memory leaks with the CRT library
Утечки памяти представляют собой наиболее незаметные и сложные для обнаружения ошибки в приложениях C/C++. Memory leaks are among the most subtle and hard-to-detect bugs in C/C++ apps. Утечки памяти появляются в результате неправильного освобождения выделенной памяти. Memory leaks result from the failure to correctly deallocate memory that was previously allocated. Небольшая утечка памяти сначала может остаться незамеченной, но постепенно может приводить к различным симптомам: от снижения производительности до аварийного завершения приложения из-за нехватки памяти. A small memory leak might not be noticed at first, but over time can cause symptoms ranging from poor performance to crashing when the app runs out of memory. Приложение, в котором происходит утечка памяти, может использовать всю доступную память и привести к аварийному завершению других приложений, в результате чего может быть непонятно, какое приложение отвечает за сбой. A leaking app that uses up all available memory can cause other apps to crash, creating confusion as to which app is responsible. Даже безобидная утечка памяти может быть признаком других проблем, требующих устранения. Even harmless memory leaks might indicate other problems that should be corrected.
Отладчик Visual Studio Visual Studio и библиотека времени выполнения C (CRT) позволяют обнаруживать и выявлять утечки памяти. The Visual Studio Visual Studio debugger and C Run-time Library (CRT) can help you detect and identify memory leaks.
Включение обнаружения утечек памяти Enable memory leak detection
Основным средством для обнаружения утечек памяти является отладчик C/C++ и отладочные функции кучи библиотеки времени выполнения C (CRT). The primary tools for detecting memory leaks are the C/C++ debugger and the C Run-time Library (CRT) debug heap functions.
Чтобы включить все отладочные функции кучи, вставьте в программу C++ следующие операторы в следующем порядке: To enable all the debug heap functions, include the following statements in your C++ program, in the following order:
Оператор #define сопоставляет базовые версии функций кучи CRT соответствующим отладочным версиям. The #define statement maps a base version of the CRT heap functions to the corresponding debug version. Если оператор #define не используется, дамп утечки памяти будет менее подробным. If you leave out the #define statement, the memory leak dump will be less detailed.
Включение файла crtdbg.h сопоставляет функции malloc и free с их отладочными версиями, _malloc_dbg и _free_dbg, которые отслеживают выделение и освобождение памяти. Including crtdbg.h maps the malloc and free functions to their debug versions, _malloc_dbg and _free_dbg, which track memory allocation and deallocation. Это сопоставление используется только в отладочных построениях, в которых определен _DEBUG . This mapping occurs only in debug builds, which have _DEBUG . В окончательных построениях используются первоначальные функции malloc и free . Release builds use the ordinary malloc and free functions.
После того как с помощью этих операторов будут включены отладочные функции кучи, можно поместить вызов _CrtDumpMemoryLeaks перед точкой выхода приложения для отображения отчета об утечке памяти перед завершением работы приложения. After you’ve enabled the debug heap functions by using the preceding statements, place a call to _CrtDumpMemoryLeaks before an app exit point to display a memory-leak report when the app exits.
Если приложение имеет несколько выходов, вам не нужно вручную размещать _CrtDumpMemoryLeaks в каждой точке выхода. If your app has several exits, you don’t need to manually place _CrtDumpMemoryLeaks at every exit point. Для автоматического вызова _CrtDumpMemoryLeaks в каждой точке выхода поместите вызов _CrtSetDbgFlag в начале приложения с помощью следующих битовых полей: To cause an automatic call to _CrtDumpMemoryLeaks at each exit point, place a call to _CrtSetDbgFlag at the beginning of your app with the bit fields shown here:
По умолчанию _CrtDumpMemoryLeaks выводит отчет об утечке памяти в область Отладка окна Вывод . By default, _CrtDumpMemoryLeaks outputs the memory-leak report to the Debug pane of the Output window. Если используется библиотека, она может переустановить вывод в другое расположение. If you use a library, the library might reset the output to another location.
_CrtSetReportMode можно использовать для перенаправления отчета в другое расположение или обратно в окно вывода, как показано ниже: You can use _CrtSetReportMode to redirect the report to another location, or back to the Output window as shown here:
Интерпретация отчета об утечке памяти Interpret the memory-leak report
Если приложение не определяет _CRTDBG_MAP_ALLOC , _CrtDumpMemoryLeaks отображает отчет об утечке памяти, аналогичный следующему: If your app doesn’t define _CRTDBG_MAP_ALLOC , _CrtDumpMemoryLeaks displays a memory-leak report that looks like:
Если приложение определяет _CRTDBG_MAP_ALLOC , отчет об утечке памяти выглядит следующим образом: If your app defines _CRTDBG_MAP_ALLOC , the memory-leak report looks like:
Во втором отчете отображается имя файла и номер строки, в которой впервые было произведено выделение утекающей памяти. The second report shows the filename and line number where the leaked memory is first allocated.
Независимо от того, определен ли _CRTDBG_MAP_ALLOC , в отчете об утечке памяти отображается следующее. Whether or not you define _CRTDBG_MAP_ALLOC , the memory-leak report displays:
- Номер выделения памяти, в этом примере — 18 . The memory allocation number, which is 18 in the example
- Тип блока, в примере — normal . The block type, normal in the example.
- Расположение памяти в шестнадцатеричном формате, в этом примере — 0x00780E80 . The hexadecimal memory location, 0x00780E80 in the example.
- Размер блока, в этом примере — 64 bytes . The size of the block, 64 bytes in the example.
- Первые 16 байт данных в блоке, в шестнадцатеричном формате. The first 16 bytes of data in the block, in hexadecimal form.
Типы блоков памяти: обычные, клиентские или CRT. Memory block types are normal, client, or CRT. Обычный блок — это обыкновенная память, выделенная программой. A normal block is ordinary memory allocated by your program. Клиентский блок — особый тип блока памяти, используемой программами MFC для объектов, для которых требуется деструктор. A client block is a special type of memory block used by MFC programs for objects that require a destructor. Оператор new в MFC создает либо обычный, либо клиентский блок, в соответствии с создаваемым объектом. The MFC new operator creates either a normal block or a client block, as appropriate for the object being created.
Блок CRT — это блок памяти, выделенной библиотекой CRT для внутреннего использования. A CRT block is allocated by the CRT library for its own use. Библиотека CRT обрабатывает освобождение этих блоков, поэтому CRT-блоки не будут отображаться в отчете об утечке памяти, если нет серьезных проблем с библиотекой CRT. The CRT library handles the deallocation for these blocks, so CRT blocks won’t appear in the memory-leak report unless there are serious problems with the CRT library.
Существуют два других типа блоков памяти, которые никогда не отображаются в отчетах об утечке памяти. There are two other types of memory blocks that never appear in memory-leak reports. Свободный блок — это блок памяти, которая была освобождена, поэтому по определению утечки здесь нет. A free block is memory that has been released, so by definition isn’t leaked. Пропускаемый блок — это память, специально помеченная для исключения из отчета об утечке памяти. An ignore block is memory that you’ve explicitly marked to exclude from the memory-leak report.
Предыдущие способы выявляют утечки памяти для памяти, выделенной с помощью стандартной функции malloc библиотеки CRT. The preceding techniques identify memory leaks for memory allocated using the standard CRT malloc function. Однако если программа выделяет память с использованием оператора new C++, то в отчете об утечке памяти вы увидите только имя файла и номер строки, где operator new вызывает _malloc_dbg . If your program allocates memory using the C++ new operator, however, you may only see the filename and line number where operator new calls _malloc_dbg in the memory-leak report. Чтобы создать более полезный отчет об утечке памяти, можно написать макрос следующего вида, и в отчете будет указываться строка, в которой было выполнено выделение: To create a more useful memory-leak report, you can write a macro like the following to report the line that made the allocation:
Теперь можно заменить оператор new с помощью макроса DBG_NEW в коде. Now you can replace the new operator by using the DBG_NEW macro in your code. В отладочных сборках DBG_NEW использует перегрузку глобальных operator new , которая принимает дополнительные параметры для типа блока, файла и номера строки. In debug builds, DBG_NEW uses an overload of global operator new that takes additional parameters for the block type, file, and line number. Перегрузка new вызывает _malloc_dbg для записи дополнительных сведений. The overload of new calls _malloc_dbg to record the extra information. Отчеты об утечке памяти показывают имя файла и номер строки, в которой были выделены утечки объектов. The memory-leak reports show the filename and line number where the leaked objects were allocated. Сборки выпуска по-прежнему используют new по умолчанию. Release builds still use the default new . Вот пример этого метода: Here’s an example of the technique:
При выполнении этого кода в отладчике Visual Studio вызов _CrtDumpMemoryLeaks создает отчет в окне вывода, который выглядит аналогичным образом: When you run this code in the Visual Studio debugger, the call to _CrtDumpMemoryLeaks generates a report in the Output window that looks similar to:
Эти выходные данные сообщают о том, что утечка памяти находилась на строке 20 файла debug_new.cpp. This output reports that the leaked allocation was on line 20 of debug_new.cpp.
Не рекомендуется создавать макрос препроцессора с именем new или любым другим ключевым словом языка. We don’t recommend you create a preprocessor macro named new , or any other language keyword.
Задание точек останова для номера выделения памяти Set breakpoints on a memory allocation number
Номер выделения памяти сообщает, когда был выделен утекающий блок памяти. The memory allocation number tells you when a leaked memory block was allocated. Например, блок с номером выделения памяти 18 — это 18-й блок памяти, выделенный во время выполнения программы. A block with a memory allocation number of 18, for example, is the 18th block of memory allocated during the run of the app. Отчет CRT учитывает все выделения блоков памяти во время выполнения, включая выделение памяти библиотекой CRT и другими библиотеками, такими как MFC. The CRT report counts all memory-block allocations during the run, including allocations by the CRT library and other libraries such as MFC. Поэтому блок с номером выделения памяти 18 может не быть 18-м блоком памяти, выделенным вашим кодом. Therefore, memory allocation block number 18 probably isn’t the 18th memory block allocated by your code.
Номер выделения можно использовать для того, чтобы задать точку останова в том месте, где выделяется память. You can use the allocation number to set a breakpoint on the memory allocation.
Установка точки останова для выделения памяти с помощью окна контрольных значений: To set a memory-allocation breakpoint using the Watch window:
Установите точку останова рядом с началом приложения и запустите отладку. Set a breakpoint near the start of your app, and start debugging.
Когда приложение приостанавливается в точке останова, откройте окно Контрольные значения, последовательно выбрав пункты Отладка > Windows > Контрольные значения 1 (или Контрольные значения 2, Контрольные значения 3 или Контрольные значения 4). When the app pauses at the breakpoint, open a Watch window by selecting Debug > Windows > Watch 1 (or Watch 2, Watch 3, or Watch 4).
В окне Контрольные значения введите _crtBreakAlloc в столбце Имя. In the Watch window, type _crtBreakAlloc in the Name column.
Если используется многопоточная версия DLL-библиотеки CRT (параметр /MD), добавьте контекстный оператор: <,,ucrtbased.dll>_crtBreakAlloc If you’re using the multithreaded DLL version of the CRT library (the /MD option), add the context operator: <,,ucrtbased.dll>_crtBreakAlloc
Убедитесь, что отладочные символы загружены. Make sure that debug symbols are loaded. В противном случае _crtBreakAlloc будет отображаться как неидентифицированный. Otherwise _crtBreakAlloc will be reported as unidentified.
Нажмите клавишу ВВОД. Press Enter.
Отладчик выполнит оценку вызова и поместит результат в столбец Значение . The debugger evaluates the call and places the result in the Value column. Это значение будет равно –1, если в местах выделения памяти не задано ни одной точки останова. This value will be -1 if you have not set any breakpoints on memory allocations.
В столбце Значение замените отображаемое значение номером выделения памяти, на котором нужно приостановить выполнение. In the Value column, replace the value with the allocation number of the memory allocation where you want the debugger to break.
После задания точки останова для номера выделения памяти можно продолжить отладку. After you set a breakpoint on a memory-allocation number, continue to debug. Убедитесь, что соблюдаются те же условия, чтобы номер выделения памяти не изменился. Make sure to run under the same conditions, so the memory-allocation number doesn’t change. Когда выполнение программы будет приостановлено на заданном выделении памяти, с помощью окна Стек вызовов и других окон отладчика определите условия выделения памяти. When your program breaks at the specified memory allocation, use the Call Stack window and other debugger windows to determine the conditions under which the memory was allocated. Затем можно продолжить выполнение программы и проследить, что происходит с этим объектом и почему выделенная ему память освобождается неправильно. Then, you can continue execution to observe what happens to the object and determine why it isn’t correctly deallocated.
Иногда может быть полезно задать точку останова по данным на самом объекте. Setting a data breakpoint on the object might also be helpful. Для получения дополнительной информации см. раздел Использование точек останова. For more information, see Using breakpoints.
Точки останова для выделения памяти можно также задать в коде. You can also set memory-allocation breakpoints in code. Можно установить следующие значения: You can set:
Сравнение состояний памяти Compare memory states
Другая технология для обнаружения утечек памяти включает получение «снимков» состояния памяти приложения в ключевых точках. Another technique for locating memory leaks involves taking snapshots of the application’s memory state at key points. Чтобы получить снимок состояния памяти в заданной точке приложения, создайте структуру _CrtMemState и передайте ее функции _CrtMemCheckpoint . To take a snapshot of the memory state at a given point in your application, create a _CrtMemState structure and pass it to the _CrtMemCheckpoint function.
Функция _CrtMemCheckpoint поместит в структуру снимок текущего состояния памяти. The _CrtMemCheckpoint function fills in the structure with a snapshot of the current memory state.
Чтобы вывести содержимое структуры _CrtMemState , передайте ее функции _ CrtMemDumpStatistics : To output the contents of a _CrtMemState structure, pass the structure to the _ CrtMemDumpStatistics function:
Функция _ CrtMemDumpStatistics выводит дамп состояния памяти, который выглядит примерно таким образом: _ CrtMemDumpStatistics outputs a dump of memory state that looks like:
Чтобы определить, произошла ли утечка памяти на отрезке кода, можно сделать снимок состояния памяти перед ним и после него, а затем сравнить оба состояния с помощью функции _ CrtMemDifference : To determine whether a memory leak has occurred in a section of code, you can take snapshots of the memory state before and after the section, and then use _ CrtMemDifference to compare the two states:
Функция _CrtMemDifference сравнивает состояния памяти s1 и s2 и возвращает результат в ( s3 ), представляющий собой разницу между s1 и s2 . _CrtMemDifference compares the memory states s1 and s2 and returns a result in ( s3 ) that is the difference between s1 and s2 .
Еще один способ поиска утечек памяти заключается в размещении вызовов _CrtMemCheckpoint в начале и конце программы с последующим использованием _CrtMemDifference для сравнения результатов. One technique for finding memory leaks begins by placing _CrtMemCheckpoint calls at the beginning and end of your app, then using _CrtMemDifference to compare the results. Если _CrtMemDifference показывает утечку памяти, можно добавить дополнительные вызовы функции _CrtMemCheckpoint , чтобы разделить программу с помощью двоичного поиска, пока не будет найден источник утечки. If _CrtMemDifference shows a memory leak, you can add more _CrtMemCheckpoint calls to divide your program using a binary search, until you’ve isolated the source of the leak.
Ложные срабатывания False positives
_CrtDumpMemoryLeaks может дать ложные признаки утечки памяти, если библиотека помечает внутренние выделения как обычные блоки, а не блоки CRT или клиентские блоки. _CrtDumpMemoryLeaks can give false indications of memory leaks if a library marks internal allocations as normal blocks instead of CRT blocks or client blocks. В таком случае функция _CrtDumpMemoryLeaks не может различать пользовательские выделения и внутренние выделения библиотеки. In that case, _CrtDumpMemoryLeaks is unable to tell the difference between user allocations and internal library allocations. Если глобальные деструкторы для выделений библиотеки выполняются после точки вызова функции _CrtDumpMemoryLeaks , каждое внутреннее выделение библиотеки принимается за утечку памяти. If the global destructors for the library allocations run after the point where you call _CrtDumpMemoryLeaks , every internal library allocation is reported as a memory leak. Версии библиотеки стандартных шаблонов, предшествовавшие Visual Studio .NET, приводили к тому, что функция _CrtDumpMemoryLeaks сообщала о таких ложных утечках. Versions of the Standard Template Library earlier than Visual Studio .NET may cause _CrtDumpMemoryLeaks to report such false positives.