Проблема освобождения указателя
char *x;
x=(char*)malloc(2);
x[0]='1';
x[1]='2';
x[2]='3';
free(x);
При попытке сделать free выскакивает сообщение об ошибке, мол
DAMAGE: after Normal block(#49) at 0x...
Причина ошибки понятна (выход за malloc ). Но возникает законный вопрос, можно ли до вызова free проверить будет ли эта ошибка, и соответственно попытаться её исправить?
Использую Visual Studio 6. Файл компилирую с расширением С.
x=(char*)malloc(2);
x[0]='1';
x[1]='2';
x[2]='3';
А почему выделяется 2 байта, а заполняется три???
так этож я намерянно ошибся, меня интересует вопрос, раз компилятор среагировал на ошибку, значит, как я полагаю, в нем есть внутренние механизмы контроля, а раз так то я тоже так хочу. Существуют ли функции или макросы для отслеживания выхода за границу указанную в malloc
ты просто повредил память по адресу x+2, в итоге и появилась подобная ошибка (надо пологать в дебаге?)
ты просто повредил память по адресу x+2, в итоге и появилась подобная ошибка (надо пологать в дебаге?)
Да все так, но если убрать free,то никаких ошибок не будет. Чтоже тогда творит эта фри, что вызывает ошибку?
Нет, для этого нужно создавать и использовать специальные классы - контейнеры массивов - в которых надо переопределить операторы [], где и будет выполняться проверка размерности.
А "дуракозащищённость" программы побеспечивается средствами типа CodeGuard (BCB). Включается в настройках проекта, и добавляет свои команды в код. Используется только в отладочных версиях программы ибо замедляет работу.
if(x){
/*чтото делать */
free(x);
}
В случае товарища lamo666 нужно использовать функцию _CrtIsValidPointer:
[in] const void * _Ptr,
[in] unsigned int _Bytes,
[in] int _ReadWrite
);
Хм. Если это просто исследовательское любопытство то есть пара соображений.
1. У меня в gcc такого не происходит, так что это скорее связано с реализацией вашего компилятора.
2. Элджер, к примеру, пишет, что в большинстве реализаций С++ new записывает пару скрытых байт перед возвращаемым адресом, для того что бы delete определил сколько памяти освобождать. Возможно (если это касается и malloc/free) в данном случае эти байты располагаются сразу за выделенной памятью и вы их затираете?
Но это все так... общие соображения. Может поэксперементировать с затиранием памяти? =) и найти тот кусок где эти скрытые байты лежат? x[100], к примеру. =)