Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 55
1

Обнаружение утечек памяти

09.02.2019, 16:31. Просмотров 1129. Ответов 6
Метки нет (Все метки)

в общем есть большой проект, изначально не мой. решил проверить весь код на утечки, подключил отлов:
C++
1
2
3
4
5
6
7
#ifdef _DEBUG
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define new DEBUG_NEW
#endif
в конце программы вставил:
C++
1
2
3
#ifdef _DEBUG
    _CrtDumpMemoryLeaks();
#endif
теперь когда запускаю отладку на дебаг конфигурации и после того как программа отработает (завершится) - в окне вывод мне выводит следующую инфу
{15990559} normal block at 0x04DF4910, 8 bytes long.
Data: < > 00 C2 D4 04 00 00 00 00
{15990558} normal block at 0x04DF41A0, 8 bytes long.
Data: < > E4 C1 D4 04 00 00 00 00
{15990557} normal block at 0x04DF4018, 8 bytes long.
Data: < > C8 C1 D4 04 00 00 00 00
и так утечек чрезмерно много, но мне это не о чем не говорит. пару утечек было в понятном мне формате (с ссылкой на конкретную строку в коде):
{370} normal block at 0x00B6ED40, 72 bytes long.
Data: < 8 @ > B8 A1 BB 00 38 C4 B8 00 98 40 B9 00 01 01 CD CD
d:\games\warcraft\unm\ghost\ghost.cpp(956) : {344} normal block at 0x00B870B0, 1024 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
почему так происходит? и как сделать чтобы все отчеты об утечках были вместе с ссылками на строку в коде?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2019, 16:31
Ответы с готовыми решениями:

Подключении механизма обнаружение утечек памяти
// output N number of M devide L.cpp : Defines the entry point for the console application. // ...

Visual Studio 2015 Обнаружение утечек памяти
В 13 студии в окно лога отладчика выводилось сообщение. Вася забыл про оператор delete! Detected...

Чтобы не было утечек памяти
Товарищи, такой вопрос: class node { int *a; double *b; vector&lt;node *&gt; vec; public: //тут...

Как проверить наличие утечек памяти в шаблоне?
при удалении дерева есть подозрение что часть не удаляется. Количество вызовов деструкторов узлов...

6
13518 / 7174 / 1720
Регистрация: 30.01.2014
Сообщений: 12,008
09.02.2019, 17:51 2
lallollulz, вы можете настроить останов на каждом из этих случаев так:
C++
1
2
3
4
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
    _CrtSetBreakAlloc(15990559);
    _CrtSetBreakAlloc(15990558);
    _CrtSetBreakAlloc(15990557);
Вот документация:
https://docs.microsoft.com/en-... ew=vs-2017
https://docs.microsoft.com/en-... ew=vs-2017
1
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 55
09.02.2019, 19:23  [ТС] 3
DrOffset, спасибо, но теперь вопросов у меня появилось еще больше))
1)
C++
1
2
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetBreakAlloc(15991085);
- этот код прекрасно работает - программа при отладке останавливается на очередной функции new, но вот когда я использую
C++
1
2
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetBreakAlloc(150);
то ничего не происходит, хотя там (на 150-ом по счету выделении памяти) тоже есть утечка - почему так?(
2) вернусь к
C++
1
2
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
_CrtSetBreakAlloc(15991085);
- компилятор останавливается, как я уже сказал выше, но не на месте утечке, запустил через отладку приложение несколько раз, и сравнив выдачу утечек, я увидел что каждый раз последние по счету утечки имеют разный номер (первые утечки имеют всегда ~150-300 - около 150 штук их), я так понял тут методом тыка прийдется искать такие утечки, на данный момент я больше озадачен почему на первых утечках не работает точка останова. если что, вами предложеный код я ввожу в самом начале функции main
0
13518 / 7174 / 1720
Регистрация: 30.01.2014
Сообщений: 12,008
09.02.2019, 19:33 4
Цитата Сообщение от lallollulz Посмотреть сообщение
почему так?(
Меняется видимо место с утечкой.

Цитата Сообщение от lallollulz Посмотреть сообщение
я больше озадачен почему на первых утечках не работает
Видимо выделение утекшей памяти происходит не в контексте вашего кода, а, например, в CRT (это не значит, что проблема в CRT).
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 55
09.02.2019, 19:38  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
Меняется видимо место с утечкой.
но как я понимаю, останов все равно должен проиходить? но ничего не происходит - программа продолжает выполнятся как не в чем не бывало
Цитата Сообщение от DrOffset Посмотреть сообщение
Видимо выделение утекшей памяти происходит не в контексте вашего кода, а, например, в CRT (это не значит, что проблема в CRT)
с этим что-то можно сделать?
0
2045 / 1519 / 167
Регистрация: 14.12.2014
Сообщений: 13,326
09.02.2019, 19:53 6
Цитата Сообщение от lallollulz Посмотреть сообщение
но как я понимаю, останов все равно должен проиходить?
И что он даст то? Суть утечки не в том что выделили неправильно а в том что потом это забыли удалить. Ловить это надо по другому. Дампировать стек вызова при выделении памяти. Потом сравнивать с тем что не удалилось и отсеивать корректоно удаленные блоки. Если так или иначе используется концепция владения то точно так же надо дампировать назначение/переназначение блока владельцу. Оставшиеся блоки покажут кто именно забыл за собой подчистить.
Ну и вообще откуда эта проблема в плюсах то взяться могла? Чтобы не в смартпоинтеры что то селить это только себе проблемы создавать. Быстрее смартпоинтеры слепить на все свои нужды.
0
13518 / 7174 / 1720
Регистрация: 30.01.2014
Сообщений: 12,008
09.02.2019, 21:06 7
Цитата Сообщение от lallollulz Посмотреть сообщение
с этим что-то можно сделать?
Попробовать добавить еще один флаг: _CRTDBG_CHECK_CRT_DF
См. документацию.

Добавлено через 33 минуты
lallollulz, Устраняйте их по одной. Начните с тех, которые вы гарантированно понимаете и знаете нормальный способ устранения. Есть вероятность, что многие другие утечки из вашего списка вызваны другими подобными ошибками. Не спешите, проверяйте все тщательно, не городите костыли, взвешивайте решения свои. Где предусмотрены какие-то неявные контракты - расставьте ассерты, чтобы их проверить. Оберните все что возможно в RAII обертки, включите максимальные предупреждения компилятора, проверьте код статическим анализатором (их много разных, clang-analyzer как вариант или более простой cppcheck, можете также поставить PVSStudio и запросить у них триальный ключик на неделю - сможете пользоваться полноценной версией в интеграции с VS). Если проект и правда очень большой, то это сложная работа, требующая внимательности и аккуратности.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.02.2019, 21:06

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Подскажите программу для диагностики утечек памяти
Здравствуйте. В одном блоге почитал, что диспетчер задач для диагностики утечек не предназначен....

Если применять эту функцию к массиву, то он будет удаляться без всяких утечек памяти и т.п.?
//Функция удаления двумерного массива void delete_array(int** arr, int row) { for (int i = 0; i...

Написал свой string. Проверьте код на наличие подводных камней, утечек памяти и других ошибок
Сделал класс, который ведет себя аналогично char*, но с возможностью сложения строк. Вроде все...

Устал от утечек памяти
С этими утечками памяти в C++ просто беда. Посоветуйте, что можно сделать? Может быть есть какие-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.