Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65

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

09.02.2019, 16:31. Показов 2292. Ответов 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(95 6) : {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
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.02.2019, 16:31
Ответы с готовыми решениями:

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

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

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

6
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.02.2019, 17:51
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
Сообщений: 65
09.02.2019, 19:23  [ТС]
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
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.02.2019, 19:33
Цитата Сообщение от lallollulz Посмотреть сообщение
почему так?(
Меняется видимо место с утечкой.

Цитата Сообщение от lallollulz Посмотреть сообщение
я больше озадачен почему на первых утечках не работает
Видимо выделение утекшей памяти происходит не в контексте вашего кода, а, например, в CRT (это не значит, что проблема в CRT).
0
0 / 0 / 0
Регистрация: 17.02.2017
Сообщений: 65
09.02.2019, 19:38  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Меняется видимо место с утечкой.
но как я понимаю, останов все равно должен проиходить? но ничего не происходит - программа продолжает выполнятся как не в чем не бывало
Цитата Сообщение от DrOffset Посмотреть сообщение
Видимо выделение утекшей памяти происходит не в контексте вашего кода, а, например, в CRT (это не значит, что проблема в CRT)
с этим что-то можно сделать?
0
 Аватар для Fulcrum_013
2083 / 1574 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
09.02.2019, 19:53
Цитата Сообщение от lallollulz Посмотреть сообщение
но как я понимаю, останов все равно должен проиходить?
И что он даст то? Суть утечки не в том что выделили неправильно а в том что потом это забыли удалить. Ловить это надо по другому. Дампировать стек вызова при выделении памяти. Потом сравнивать с тем что не удалилось и отсеивать корректоно удаленные блоки. Если так или иначе используется концепция владения то точно так же надо дампировать назначение/переназначение блока владельцу. Оставшиеся блоки покажут кто именно забыл за собой подчистить.
Ну и вообще откуда эта проблема в плюсах то взяться могла? Чтобы не в смартпоинтеры что то селить это только себе проблемы создавать. Быстрее смартпоинтеры слепить на все свои нужды.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
09.02.2019, 21:06
Цитата Сообщение от lallollulz Посмотреть сообщение
с этим что-то можно сделать?
Попробовать добавить еще один флаг: _CRTDBG_CHECK_CRT_DF
См. документацию.

Добавлено через 33 минуты
lallollulz, Устраняйте их по одной. Начните с тех, которые вы гарантированно понимаете и знаете нормальный способ устранения. Есть вероятность, что многие другие утечки из вашего списка вызваны другими подобными ошибками. Не спешите, проверяйте все тщательно, не городите костыли, взвешивайте решения свои. Где предусмотрены какие-то неявные контракты - расставьте ассерты, чтобы их проверить. Оберните все что возможно в RAII обертки, включите максимальные предупреждения компилятора, проверьте код статическим анализатором (их много разных, clang-analyzer как вариант или более простой cppcheck, можете также поставить PVSStudio и запросить у них триальный ключик на неделю - сможете пользоваться полноценной версией в интеграции с VS). Если проект и правда очень большой, то это сложная работа, требующая внимательности и аккуратности.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2019, 21:06
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru