이 글을 반복해서 쓰느라 지쳤습니다:
double* data = (double*)malloc(20 * sizeof(double)); if (data == NULL) { fputs("out of memory", stderr); abort(); }
오늘 저는 malloc()에서 반환된 포인터가 NULL인 경우 프로세스를 종료하는 emalloc() 및 ecalloc()과 같은 e___() 함수 계열이 있다는 것을 배웠습니다. 이러한 기능은 운영 체제의 util.h 시스템 헤더의 BSD 계열에만 존재합니다. 표준 C 함수가 아닙니다.
#include <util.h> void (*)(int, const char *, ...) esetfunc(void (*)(int, const char *, ...)); int easprintf(char ** restrict str, const char * restrict fmt, ...); FILE * efopen(const char *p, const char *m); void * ecalloc(size_t n, size_t s); void * emalloc(size_t n); void * erealloc(void *p, size_t n); void ereallocarr(void *p, size_t n, size_t s); char * estrdup(const char *s); char * estrndup(const char *s, size_t len); size_t estrlcat(char *dst, const char *src, size_t len); size_t estrlcpy(char *dst, const char *src, size_t len); intmax_t estrtoi(const char * nptr, int base, intmax_t lo, intmax_t hi); uintmax_t estrtou(const char * nptr, int base, uintmax_t lo, uintmax_t hi); int evasprintf(char ** restrict str, const char * restrict fmt, ...);
easprintf(), efopen(), ecalloc(), emalloc(), erealloc(), ereallocarr(), estrdup(), estrndup(), estrlcat(), estrlcpy(), estrtoi(), estrtou( ) 및 evasprintf() 함수는 오류가 발생한 경우 esetfunc()로 구성할 수 있는 설치된 오류 처리기를 호출한다는 점을 제외하면 e로 시작하지 않는 해당 함수와 동일하게 작동합니다.
문자열 처리 기능의 경우 대상 버퍼가 전체 문자열을 담을 만큼 크지 않으면 오류가 발생합니다. 메모리를 할당하거나 파일을 여는 함수의 경우 널 포인터를 반환하면 오류가 발생합니다. 기본 오류 처리기는 err()입니다. esetfunc() 함수는 이전 오류 처리기 함수를 반환합니다. NULL 오류 핸들러는 단순히 종료()를 호출합니다.
— emalloc(3) - NetBSD 매뉴얼 페이지
이러한 기능은 비교적 간단합니다. 직접 쉽게 구현할 수 있습니다.
// I don't know if static or inline is better. inline void * emalloc(size_t n) { void *p = malloc(n); if (p == NULL) { fputs("out of memory", stderr); abort(); } return p; } // Do the same wrapper thing for all the other functions.
저는 이것이 운영 체제의 C 표준 라이브러리에 내장되는 것이 멋지다고 생각했습니다. 당연히 배터리도 포함되어 있습니다.
그리고 C: 널 포인터를 반환합니다. ?♀️ 제어가 필요하면 좋고, 행복한 길을 원한다면 번거롭습니다.
위 내용은 TIL emalloc()은 메모리 부족 오류 시 자동 종료됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!