Пишу прогу в VS2005. При вызове одного из многочисленных realloc'ов меня выкидываeт в файл realloc.c (в функцию _realloc_base) с ошибкой "Heap block at 008B2EB8 modified at 008B2ECC past requested size of c". Не понимаю, за что? Если не хватает памяти почему тогда NULL не возвращает?
MegaDwarf Эта ошибка означает, что ты модифицировал память за пределами выделенного блока - где-то "вылез" за пределы буфера.
я гляжу вы тут с юмором Все дело в том, что исходников довольно много и я не хотел бы никого так напрягать. Ибо копаться в чужих исходниках не есть благодарное дело. Если realloc заменить на несколько идентичных строк с malloc'ом, memcpy и free, то тогда ошибка будет на free. А если free вообще не вызывать (т.е. просто забивать на старую не нужную выделенную память), то ошибки не будет. Почему тогда в этом случае он не может распознать, что я якобы "вылез" за пределы буфера?
Т.к. писать за пределы выделенного буфера можно. Там, насколько я знаю (хотя возможно и не прав) стоят контрольные байты. У меня была похожая проблема с HeapRealloc. Как только я избавился от переполнения, она (ф-я) тут же стала работать нормально.
MegaDwarf Ну так free и realloc проверяют целостность кучи, а именно того блока памяти, указатель на который ты им передаёшь. Естественно, если не вызывать ни ту, ни другую функцию, то никакой ошибки не будет - просто никакие проверки не будут сделаны.
Лучше на время отладки переписать аллокатор, чтобы буфера веделялись на границах страниц и любые обращения за буфер будут уже на недействительной странице - любое переполнение кучи ловится на ура. Я себе такой уже состряпал, оч удобно. В отладочной версии так точно есть, насколько я помню и в "релиз" тоже. + Теперь еще (начиная с 7 студии) мелкомягкие накрутили всяких финтов для отловки переполнений стека - всякие там __security_check_cookie и все такое. Иногда тоже помогает.
Great От кривых рук ничего не спасёт. В последнее время, копаясь в документации к исходникам, часто попадаются примерно такие рекомендации: "чтобы прога не падала, отключите в опциях компилятора проверки целостности стека, кучи и т.д."