C - Если используется realloc, нужно ли это бесплатно? - PullRequest
16 голосов
/ 25 марта 2011

При использовании realloc память автоматически освобождается? Или нужно использовать free с realloc? Что из следующего является правильным?

//Situation A
ptr1 = realloc(ptr1, 3 * sizeof(int));

//Situation B
ptr1 = realloc(ptr2, 3 * sizeof(int));
free(ptr1);
ptr1 = ptr2;

Ответы [ 5 ]

41 голосов
/ 25 марта 2011

Ни один из них не является правильным. realloc () может вернуть указатель на вновь выделенную память или NULL в случае ошибки. Что вы должны сделать, это проверить возвращаемое значение:

ptr1 = realloc(ptr2, 3 * sizeof(int));
if (!ptr1) {
    /* Do something here to handle the failure */
    /* ptr2 is still pointing to allocated memory, so you may need to free(ptr2) here */
}

/* Success! ptr1 is now pointing to allocated memory and ptr2 was deallocated already */
free(ptr1);
10 голосов
/ 25 марта 2011

После ptr1 = realloc(ptr2, 3 * sizeof(int)); ptr2 недействителен и не должен использоваться.Вам нужно только бесплатно ptr1некоторых случаях возвращаемое значение realloc будет тем же значением, которое вы передали.

Вы можете смело считать ptr1=realloc(ptr2, ... эквивалентным этому:

ptr1 = malloc(...);
memcpy(ptr1, ptr2, ...);
free(ptr2);

Это то, что происходит в большинстве случаев, если новый размер все еще не помещается в старый блок памяти - тогда realloc может вернуть исходный блок памяти.

Как и другие функции выделения, realloc возвращает NULL, еслине удается - вы можете проверить это.

4 голосов
/ 25 марта 2011

realloc() автоматически освобождает исходную память или возвращает ее без изменений (кроме метаданных), если вы realloc() уменьшены в размере или имеется нераспределенная память, доступная для простого расширения исходного выделения на месте.

1 голос
/ 25 марта 2011

Согласно http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/, realloc возвращает новый блок памяти, если перераспределение выполнено успешно, сохраняет исходный блок памяти, если нет.Стандартное использование будет выглядеть так:

ptr2 = realloc(ptr1, new_size);
if (ptr2 == NULL) {
   //ptr1 still contains pointer to original array
} else {
   //ptr2 contains new array, ptr1 is invalid
}
0 голосов
/ 25 марта 2011

В обеих ситуациях ptr1 должен быть освобожден.

Ситуация B более сложная, поскольку ptr2 потенциально указывает на освобожденное пространство.Или нет.Это зависит от того, может ли оно быть перераспределено.ptr2 не должен использоваться после realloc в B.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...