Может любой суммировать то, что является корректным использованием realloc()
?
Что Вы делаете когда realloc()
сбои?
Из того, что я видел до сих пор, это кажется этим если realloc()
сбои, Вы имеете к free()
старый указатель. Это верно?
Вот пример:
1. char *ptr = malloc(sizeof(*ptr) * 50);
2. ...
3. char *new_ptr = realloc(ptr, sizeof(*new_ptr) * 60);
4. if (!new_ptr) {
5. free(ptr);
6. return NULL;
7. }
Предположим realloc()
сбои на строке 3
. Я делаю правильную вещь на строке 5
free()
луг ptr
?
Из http://www.c-faq.com/malloc/realloc.html
Если realloc вообще не может найти достаточно места, он возвращает нулевой указатель и оставляет предыдущую область выделенной.
Следовательно, вам действительно нужно будет освободить ранее выделенную память.
Edit: Поправка, некоторые люди ругают меня за то, что я сказал, то, как вы выделили указатель, кажется, является лучшей практикой среди них, меня учили всегда идти с приведением типов в sizeof()
, но, очевидно, ваш способ более правильный, так что не обращайте внимания на то, что я сказал =)
Заглянув в http://en.wikipedia.org/wiki/Malloc#realloc раньше, вы могли бы получить некоторую пользу.
Вы не совсем понимаете sizeof()
- он имеет значение размера аргумента, который вы ему передаете, в байтах. Например, sizeof(int)
будет равен 4 на большинстве 32-битных систем, но вы все равно должны использовать sizeof(int)
вместо 4
, потому что при компиляции вашего кода на 64-битной системе (просто как пример) это значение будет равно 8, и ваш код все равно будет компилироваться нормально. Для чего вы выделяете память? Указатели? Если да, то вам следует использовать sizeof(void*)
(вы можете сказать sizeof(int*)
, но это обычная конвенция - не упоминать компилятору, что вы хотите хранить в этих указателях, поскольку все указатели должны быть одного размера - поэтому большинство программистов говорят sizeof(void*)
), если вам нужно место для символов, используйте sizeof(char)
и так далее.
Однако вы правы, если храните возвращаемое значение realloc()
в новом указателе и проверяете его, хотя многие программисты полагают, что в системе всегда достаточно памяти, и уходят от ответа.
Это зависит от того, что вы хотите сделать. Когда realloc
дает сбой, что вы хотите сделать: освободить старый блок или оставить его живым и неизменным? Если вы хотите освободить его, то освободите его.
Также имейте в виду, что в C89 / 90, если вы сделаете запрос realloc
с нулевым целевым размером, функция realloc
может вернуть нулевой указатель, даже если исходная память была успешно выполнена. освобожден. Это был дефект в C89 / 90, поскольку не было способа отличить успех от неудачи при возврате нуля.
В C99 этот дефект был исправлен, и была гарантирована строгая связь между нулевым возвратом и успехом / неудачей перераспределения. В C99 возврат null всегда означает полный отказ realloc
.
Если перераспределение не удается, я не думаю, что вы захотите удалить исходный блок, так как вы его потеряете. Похоже, что realloc изменит размер старого блока (или вернет указатель на новое местоположение) и в случае успеха вернет указатель на старый блок (или новое местоположение), а в случае неудачи вернет NULL. Если он не может выделить новый блок, старый блок остается нетронутым.