c освобождение malloc (0) - PullRequest
       4

c освобождение malloc (0)

2 голосов
/ 10 января 2012

Я пишу приложение на языке c, в котором динамически выделяю память, необходимую для некоторых массивов. Я знаю, что многие из этих массивов будут нуждаться в нулевом распределении. Итак, будут ли проблемы, когда я позвоню на них бесплатно? например, free(malloc(0 * sizeof(int)));? Я знаю, что мое приложение компилируется и работает нормально на моей машине, но могу ли я на это положиться? Ура! * * 1002

Ответы [ 4 ]

8 голосов
/ 10 января 2012

Вы можете безопасно free(malloc(0)).

из man malloc:

Если size равно 0, то malloc() возвращает либо NULL, либоуникальное значение указателя, которое впоследствии может быть успешно передано в free().

free:

Если ptr равен NULL, никакие операции не выполняются

4 голосов
/ 10 января 2012

malloc(0) может (это определяется реализацией) возвращать нулевой указатель или может возвращать новый указатель каждый раз, когда вы вызываете его. В любом случае возвращаемое значение действительно для передачи на free, так как free(0) в любом случае не работает. Однако из-за некоторых неприятных проблем с обнаружением и обработкой сбоя realloc и разногласий между ISO C и POSIX я настоятельно рекомендую никогда передавать размер от 0 до malloc или realloc. Вы всегда можете просто добавить +1 или |1 в конец аргумента к malloc, и тогда вы обязательно получите уникальный указатель (отличный от нулевого указателя или адреса любого другого объекта) каждый раз Вы называете это.

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

1 голос
/ 10 января 2012

Всегда допустимо вызывать free по результату malloc (один раз).

0 голосов
/ 10 января 2012

Да, free(malloc(0)) гарантированно работает.

Подробнее об этом см. какой смысл в malloc (0)?

...