Обычно один тест проверяет, чтобы результат malloc
не был NULL
, чтобы узнать, успешно ли выделено память. При серии вызовов malloc
это становится длительным или утомительным набором сравнений.
Вместо этого можно было бы установить errno = 0
в верхней части серии вызовов malloc
, а затем проверить на errno == ENOMEM
в конце?
Предполагается, что если какое-либо распределение завершится неудачно, программа или функция не смогут продолжить работу и должны вернуться / выручить. Также предполагается, что вызовы malloc
являются последовательными и непрерывными, и что, согласно руководству, malloc
может установить только errno
на ENOMEM
.
Примером может быть что-то вроде следующего кода:
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#define N (1 << 20)
int main()
{
double *a = NULL;
double *b = NULL;
double *c = NULL;
errno = 0;
a = malloc(N * sizeof *a);
b = malloc(N * sizeof *b);
c = malloc(N * sizeof *c);
if (errno == ENOMEM) {
perror(NULL);
free(a);
free(b);
free(c);
return EXIT_FAILURE;
}
errno = 0;
/* Do interesting stuff */
free(a);
free(b);
free(c);
return EXIT_SUCCESS;
}
(В примере используется main()
, но это может быть и другая функция, которая просто не может быть запущена, но в противном случае программа может продолжиться, и никакого фактического выхода из программы не произойдет, и вызовы free()
необходимы .)
Я не вижу причин, почему это нельзя сделать безопасно, но я не сталкивался с этой идиомой, отсюда и вопрос.