реклама на сайте
подробности

 
 
> Минимальный менеджер кучи для WinAVR
_Pasha
сообщение Feb 3 2009, 15:15
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Доброго времени суток!

Возникла необходимость в написании сабжа. Есть вопрос, касающийся поведения функции realloc()

Если указатель равен нулю - понятно, переход на  malloc(size)

Если размер равен нулю - никто меня тапками не закидает, если это будет переход на free(ptr)

А как быть, если ptr ссылается на невалидную память? Что при этом возвращать? Валидность указателя  определяется исходя из целостности всей кучи, и неправильный указатель может указывать не только за пределы динамической памяти, но и не на начало блока, либо на начало уже освобожденного блока. С free() - нет проблем, можно ничего не освобождать.

Короче, что надо вернуть: NULL или значение, переданное в параметрах, или правильный адрес блока ?

Спасибо за потраченное на меня время.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 3)
aaarrr
сообщение Feb 3 2009, 15:26
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Стандарт говорит, что behavior is undefined:
Цитата
If ptr does not match a pointer earlier returned by the
calloc, malloc, or realloc function, or if the space has been deallocated by a call
to the free or realloc function, the behavior is undefined.


Я бы вернул NULL.
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Feb 3 2009, 16:04
Сообщение #3


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата
Если размер равен нулю - никто меня тапками не закидает, если это будет переход на free(ptr)


упс, низзя, оказывается smile.gif http://www.mail-archive.com/linux-man@vger...g/msg00078.html

Я понял, почему: легче отловить точки освобождения памяти в тексте.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Feb 3 2009, 18:00
Сообщение #4


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(_Pasha @ Feb 3 2009, 19:04) *
упс, низзя, оказывается

Ага. Результатом malloc(0) будет валидный указатель...

Вернуть NULL, потому что после realloc следующим шагом проверка успешности операции путем сравнивая результата с NULL. А дальше программер сам сообразит при поиске ошибки.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 04:33
Рейтинг@Mail.ru


Страница сгенерированна за 0.01343 секунд с 7
ELECTRONIX ©2004-2016