Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема освобождения указателя

13K
21 марта 2007 года
lamo666
4 / / 23.11.2005
Здраствуйте, при изучении указателей возник следующий вопрос.
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. Файл компилирую с расширением С.
309
21 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
char *x;
x=(char*)malloc(2);
x[0]='1';
x[1]='2';
x[2]='3';


А почему выделяется 2 байта, а заполняется три???

13K
21 марта 2007 года
lamo666
4 / / 23.11.2005
Цитата: el scorpio
А почему выделяется 2 байта, а заполняется три???



так этож я намерянно ошибся, меня интересует вопрос, раз компилятор среагировал на ошибку, значит, как я полагаю, в нем есть внутренние механизмы контроля, а раз так то я тоже так хочу. Существуют ли функции или макросы для отслеживания выхода за границу указанную в malloc

240
21 марта 2007 года
aks
2.5K / / 14.07.2006
Это разве на этапе компиляции ошибка произошла?
ты просто повредил память по адресу x+2, в итоге и появилась подобная ошибка (надо пологать в дебаге?)
13K
21 марта 2007 года
lamo666
4 / / 23.11.2005
Цитата: aks
Это разве на этапе компиляции ошибка произошла?
ты просто повредил память по адресу x+2, в итоге и появилась подобная ошибка (надо пологать в дебаге?)



Да все так, но если убрать free,то никаких ошибок не будет. Чтоже тогда творит эта фри, что вызывает ошибку?

309
22 марта 2007 года
el scorpio
1.1K / / 19.09.2006
Цитата:
Существуют ли функции или макросы для отслеживания выхода за границу указанную в malloc


Нет, для этого нужно создавать и использовать специальные классы - контейнеры массивов - в которых надо переопределить операторы [], где и будет выполняться проверка размерности.

А "дуракозащищённость" программы побеспечивается средствами типа CodeGuard (BCB). Включается в настройках проекта, и добавляет свои команды в код. Используется только в отладочных версиях программы ибо замедляет работу.

26K
22 марта 2007 года
powt.63kvv
8 / / 08.03.2007
Для корректной работы функций callolc и malloc после инициализации укузателей следует проверять результат выполнения функции. При ошибочной инициализации функция вернет 0. В данном случае:
 
Код:
x=(char*)malloc(2);
if(x){

/*чтото делать */

free(x);
}
11K
24 марта 2007 года
_io_lock
73 / / 05.10.2006
Нет, подобные функции существуют, но лишь в отладочных (Debug) версиях программ, в которых используется специальная crt - DCRT (Debug CRT). Для её использования нужно подключить хидер <crtdbg.h>. В этой версии crt до фига полезнейших функций для отладочной диагностики памяти, но следет помнить, что она не будет работать в RELEASE-версии.
В случае товарища lamo666 нужно использовать функцию _CrtIsValidPointer:
 
Код:
int __cdecl _CrtIsValidPointer(
  [in] const void * _Ptr,
  [in] unsigned int _Bytes,
  [in] int _ReadWrite
);
361
24 марта 2007 года
Odissey_
661 / / 19.09.2006
Цитата:
Да все так, но если убрать free,то никаких ошибок не будет. Чтоже тогда творит эта фри, что вызывает ошибку?


Хм. Если это просто исследовательское любопытство то есть пара соображений.
1. У меня в gcc такого не происходит, так что это скорее связано с реализацией вашего компилятора.
2. Элджер, к примеру, пишет, что в большинстве реализаций С++ new записывает пару скрытых байт перед возвращаемым адресом, для того что бы delete определил сколько памяти освобождать. Возможно (если это касается и malloc/free) в данном случае эти байты располагаются сразу за выделенной памятью и вы их затираете?
Но это все так... общие соображения. Может поэксперементировать с затиранием памяти? =) и найти тот кусок где эти скрытые байты лежат? x[100], к примеру. =)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог