Проверка кучи на корректность HeapValidate
От: Seninandrew Россия  
Дата: 17.10.03 17:00
Оценка:
Здравствуйте!

Я переписал операторы new и delete с целью выделять по отдельной кучи для каждого потока. Использовал функции Win API (HeapCreate, HeapAlloc...).

После некоторого времени работы программы куча становится испорченной (HeapValidate == false). Это при том, что используется пока только один поток.

Может быть кто-то знает, как происходит проверка кучи? В каком случае она считается невалидной?

Андрей.
Re: Проверка кучи на корректность HeapValidate
От: adontz Грузия http://adontz.wordpress.com/
Дата: 18.10.03 00:18
Оценка:
Здравствуйте, Seninandrew, Вы писали:

Поставь HeapValidate после каждого (и перед каждым!!!) вызовом Heap***

По вопросу. Я так понимаю, главная проблема это выделили 10 байт, записали 11.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Проверка кучи на корректность HeapValidate
От: Seninandrew Россия  
Дата: 18.10.03 12:30
Оценка:
Да, я так и сделал. Вопрос в том, как отладить приложение. Для этого надо знать, в каких случаях куча считается невалидной.

Мне вчера ночью удалось устранить ошибку . Сложилась именно та ситуация, о которой ты говоришь : запись по несуществующему элементу массива. Но вопрос остается открытым: каков полный список ситуаций, где куча некорректна?

Жду идей!
Re[3]: Проверка кучи на корректность HeapValidate
От: adontz Грузия http://adontz.wordpress.com/
Дата: 18.10.03 12:41
Оценка:
Здравствуйте, Seninandrew, Вы писали:

Ну давай подумаем.
В куче есть блоки памяти и описатели блоков памяти (где какие, где свободное место и.т.д)
Блоки можно попортить только записав больше их размера (а как ещё?)
описатели блоков ИМХО в памяти ядра, туда фиг доберёшься.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Проверка кучи на корректность HeapValidate
От: Artour A. Bakiev  
Дата: 18.10.03 15:16
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, Seninandrew, Вы писали:


A>Ну давай подумаем.

A>В куче есть блоки памяти и описатели блоков памяти (где какие, где свободное место и.т.д)
A>Блоки можно попортить только записав больше их размера (а как ещё?)
A>описатели блоков ИМХО в памяти ядра, туда фиг доберёшься.

Описатели блоков находятся в памяти пользователя. ::HeapCreate возвращает указатель на блок памяти, где находится administration header свежесозданной кучи.
... << RSDN@Home 1.1 beta 1 >>
Re[4]: Проверка кучи на корректность HeapValidate
От: SergH Россия  
Дата: 19.10.03 14:27
Оценка:
Здравствуйте, adontz, Вы писали:

A>Блоки можно попортить только записав больше их размера (а как ещё?)


Ещё можно записать до начала. И вообще по случайному адресу, если он попадёт в кучу, в невыделенную/служебную часть.
Делай что должно, и будь что будет
Re[5]: Проверка кучи на корректность HeapValidate
От: Seninandrew Россия  
Дата: 21.10.03 14:24
Оценка:
Спасибо всем, кто принимал участие в дискуссии!

Я попробую на неделе пройтись по куче с использованием ф-ии HeapWalk.
Мне интересно узнать, используется ли в стандартной реализации операторов new
и delete куча, возвращаемая GetProcessHeap. Если да, то почему при их
использовании проверка HeapValidate дает добро. Об интересных результатах напишу.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.