>백엔드 개발 >C++ >TIL emalloc()은 메모리 부족 오류 시 자동 종료됩니다.

TIL emalloc()은 메모리 부족 오류 시 자동 종료됩니다.

Barbara Streisand
Barbara Streisand원래의
2024-11-05 09:49:02512검색

TIL emalloc() auto-exits on out-of-memory errors

이 글을 반복해서 쓰느라 지쳤습니다:

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 표준 라이브러리에 내장되는 것이 멋지다고 생각했습니다. 당연히 배터리도 포함되어 있습니다.

메모리 부족 오류가 발생하면 다른 언어는 어떻게 합니까?

  • Java: 예외 발생
  • C : 예외 발생
  • Rust: 중단 또는 패닉
  • JavaScript: 엔진 충돌
  • Python: 특별한 예외를 발생시킵니다
  • 이동: 종료

그리고 C: 널 포인터를 반환합니다. ?‍♀️ 제어가 필요하면 좋고, 행복한 길을 원한다면 번거롭습니다.

위 내용은 TIL emalloc()은 메모리 부족 오류 시 자동 종료됩니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.