Поиск ошибок при работе с памятью
От: Александр Шаргин Россия RSDN.ru
Дата: 03.07.03 11:58
Оценка: 300 (12) +1
Статья:
Поиск ошибок при работе с памятью
Автор(ы): Александр Шаргин
Дата: 27.01.2002


Авторы:
Александр Шаргин

Аннотация:
Ошибки при работе с памятью принадлежат к числу самых распространённых ошибок, с которыми приходится сталкиваться программисту на языке C++. Поэтому в Visual C++ включено специальное средство для поиска ошибок подобного рода – отладочная библиотека времени выполнения (Debug CRT, DCRT). Она включает в себя функции для работы с отладочной кучей (debug heap), которая поможет вам обнаружить:

— записи за границу выделенного блока памяти
— записи в уже освобождённый блок памяти
— утечки памяти

Прежде чем изучать функции, предназначенные для работы с отладочной кучей, кратко рассмотрим принципы её работы.
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
Re: Поиск ошибок при работе с памятью
От: vgrigor  
Дата: 04.07.03 06:48
Оценка:
Весьма полезная статья,
но было бы неплохо если бы вы привели самые короткие комментарии по необходимости использования
проверяльщиков типа Bounds Checker.
Многие говорят что это средства "must have" — может и эффективнее найти и время сэкономят.

________________

"Индюк думал, да в суп попал" — народная мудрость.
Винтовку добудешь в бою!
Re: Поиск ошибок при работе с памятью
От: vgrigor  
Дата: 04.07.03 06:51
Оценка:
Кстати есть куча статей про "инструментирование" кода,
полуавтоматические проверки, в том числе с использованием расширенных средств компилятора.

колонка —
"BugsLayer"

Чего вы ссылки очен коротко не привели — может быть весьма полезным.

________________________

Рейхс-программирование — лучше написания программ.
Винтовку добудешь в бою!
Re[2]: Поиск ошибок при работе с памятью
От: vgrigor  
Дата: 04.07.03 09:18
Оценка: 12 (1)
Ваши коллеги:

Smart Cleanup
"chieve More Reliable Resource Management with Our Custom C++ Classes"

http://msdn.microsoft.com/msdnmag/issues/03/06/ResourceManagement/default.aspx


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.
Винтовку добудешь в бою!
Re[3]: Поиск ошибок при работе с памятью
От: alexkro  
Дата: 05.07.03 08:30
Оценка:
Здравствуйте, vgrigor, Вы писали:


V>Ваши коллеги:


V>Smart Cleanup

V>"chieve More Reliable Resource Management with Our Custom C++ Classes"

V>http://msdn.microsoft.com/msdnmag/issues/03/06/ResourceManagement/default.aspx


Спасибо за ссылку. Очень хорошая библиотечка. Кстати, не заметил, как автор определяет, является ли шаблонный параметр managed типом в файле smart_any_fwd.h?
Re: Поиск ошибок при работе с памятью
От: BOPOH_N Россия  
Дата: 12.05.04 18:44
Оценка: +1
Маленький коментарий по поводу пренебрежительного отношения к флагу _CRTDBG_REPORT_FLAG
Пример кода:
void MyFunc(const char* str)
{
//....
}

int main()
{
  std::strstream stream;
  stream << "Hello word!";
  MyFunc(stream.str());
  return 0;
}

Этот код вызовет утечку памяти, но вам ее будет очень сложно найти, если флаг _CRTDBG_REPORT_FLAG не будет выставлен. В данном примере не хватает вызова stream.freeze(false); и поток не освободит буфер выделеный в файле strstrea.cpp(81) (для VC 7.1)
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re[2]: Поиск ошибок при работе с памятью
От: xlend  
Дата: 04.08.06 07:15
Оценка:
BOP>Маленький коментарий по поводу пренебрежительного отношения к флагу _CRTDBG_REPORT_FLAG
BOP>Пример кода:
BOP>
BOP>void MyFunc(const char* str)
BOP>{
BOP>//....
BOP>}

BOP>int main()
BOP>{
BOP>  std::strstream stream;
BOP>  stream << "Hello word!";
BOP>  MyFunc(stream.str());
BOP>  return 0;
BOP>}
BOP>

BOP>Этот код вызовет утечку памяти, но вам ее будет очень сложно найти, если флаг _CRTDBG_REPORT_FLAG не будет выставлен. В данном примере не хватает вызова stream.freeze(false); и поток не освободит буфер выделеный в файле strstrea.cpp(81) (для VC 7.1)

_CRTDBG_CHECK_CRT_DF вы имели в виду, или я чего-то недопонимаю?
Re: Поиск ошибок при работе с памятью
От: EViruS Россия  
Дата: 20.04.07 18:19
Оценка:
Кривое решение, имеет очень много проблем.
Например, простейшие:
1. Перекрывается не все так как бы хотелось — вот как например понимать: operator new(size_t s, 4, "something", "something") у класса ??? — раскрытие вашего дефайна. Как пример, подключи #include <d3d9x.h>. Ошибка компиляции.
2. STL обнаруживаются, но не указывается где произошли. Неинформативно.
3. При использовании не помню каких точно хидеров будем иметь ошибки компиляции в <xdebug>.
и этим все не ограничивается, увы

а Bounds Checker, к слову, тож кривоват, по крайней мере 7.2 у меня отказывается нормально собирать статистику Final Check'om.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.