Аннотация:
Ошибки при работе с памятью принадлежат к числу самых распространённых ошибок, с которыми приходится сталкиваться программисту на языке C++. Поэтому в Visual C++ включено специальное средство для поиска ошибок подобного рода – отладочная библиотека времени выполнения (Debug CRT, DCRT). Она включает в себя функции для работы с отладочной кучей (debug heap), которая поможет вам обнаружить:
— записи за границу выделенного блока памяти
— записи в уже освобождённый блок памяти
— утечки памяти
Прежде чем изучать функции, предназначенные для работы с отладочной кучей, кратко рассмотрим принципы её работы.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Весьма полезная статья,
но было бы неплохо если бы вы привели самые короткие комментарии по необходимости использования
проверяльщиков типа Bounds Checker.
Многие говорят что это средства "must have" — может и эффективнее найти и время сэкономят.
________________
"Индюк думал, да в суп попал" — народная мудрость.
SUMMARY Managing resources in C++ is not easy. When you're unsuccessful, your app can leak all kinds of resources including file system handles, database connections, and, of course, memory. Even in garbage-collected languages like Managed C++, resource management is difficult because garbage collection only deals with memory management, not the other resources that cause performance problems.
In this article, the author describes the SmartAny template library he created, which uses a policy-based approach to dynamic resource management. Readers will learn how to use the SmartAny classes and policies to ensure the proper cleanup of their resources, be they files, OS handles, or native and unmanaged objects.
Спасибо за ссылку. Очень хорошая библиотечка. Кстати, не заметил, как автор определяет, является ли шаблонный параметр managed типом в файле smart_any_fwd.h?
Этот код вызовет утечку памяти, но вам ее будет очень сложно найти, если флаг _CRTDBG_REPORT_FLAG не будет выставлен. В данном примере не хватает вызова stream.freeze(false); и поток не освободит буфер выделеный в файле strstrea.cpp(81) (для VC 7.1)
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
BOP>Этот код вызовет утечку памяти, но вам ее будет очень сложно найти, если флаг _CRTDBG_REPORT_FLAG не будет выставлен. В данном примере не хватает вызова stream.freeze(false); и поток не освободит буфер выделеный в файле strstrea.cpp(81) (для VC 7.1)
_CRTDBG_CHECK_CRT_DF вы имели в виду, или я чего-то недопонимаю?
Кривое решение, имеет очень много проблем.
Например, простейшие:
1. Перекрывается не все так как бы хотелось — вот как например понимать: operator new(size_t s, 4, "something", "something") у класса ??? — раскрытие вашего дефайна. Как пример, подключи #include <d3d9x.h>. Ошибка компиляции.
2. STL обнаруживаются, но не указывается где произошли. Неинформативно.
3. При использовании не помню каких точно хидеров будем иметь ошибки компиляции в <xdebug>.
и этим все не ограничивается, увы
а Bounds Checker, к слову, тож кривоват, по крайней мере 7.2 у меня отказывается нормально собирать статистику Final Check'om.