맨위로가기

C 동적 메모리 할당

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C 동적 메모리 할당은 C 언어에서 메모리를 효율적으로 관리하기 위한 중요한 기능으로, 초기 유닉스 시스템의 `alloc` 및 `free` 함수에서 시작되어 `malloc`, `calloc`, `realloc`, `free` 함수로 표준화되었다. 이러한 함수들은 stdlib.h (C++) 헤더 파일에 정의되어 있으며, 프로그램 실행 중에 필요한 만큼의 메모리를 할당하고 해제할 수 있게 해준다. 동적 메모리 할당은 배열의 크기를 런타임에 결정하거나, 메모리 누수, 댕글링 포인터, 이중 해제와 같은 오류를 유발할 수 있으므로 주의해서 사용해야 한다. 다양한 메모리 할당기 구현이 존재하며, 특정 애플리케이션의 요구에 맞게 `malloc` 인터페이스를 확장하거나 대안을 사용할 수도 있다.

2. 역사

C 프로그래밍 언어의 메모리 관리는 초기에 `alloc`과 `free` 함수를 통해 이루어졌다. 유닉스 6판 문서는 로우 레벨 메모리 할당 함수로 `alloc`과 `free`를 제공했다.[7] 유닉스 7판에서는 `malloc`과 `free` 루틴이 표준화되었다.[8][9] C의 원래 설명에는 `calloc`과 `cfree`가 표준 라이브러리에 포함되어 있었지만, `malloc`은 없었다. 대신, `alloc`과 `free` 함수가 사용자 인터페이스 함수로 사용되었고, 운영 체제에서 메모리를 요청하기 위해 `sbrk` 시스템 호출을 사용했다.[6]

3. 함수의 종류 및 사용법

C 언어의 동적 메모리 할당 함수들은 `stdlib.h` 헤더 파일에 정의되어 있다.[1]

함수설명
malloc지정된 바이트 수를 할당한다.
aligned_alloc지정된 정렬 방식에 따라 지정된 바이트 수를 할당한다.
realloc지정된 메모리 블록의 크기를 늘리거나 줄이며, 필요한 경우 메모리를 이동한다.
calloc지정된 바이트 수를 할당하고 0으로 초기화한다.
free지정된 메모리 블록을 시스템에 반환한다.


3. 1. `malloc`

`malloc`은 지정된 바이트 수만큼 메모리를 할당한다.[1] `malloc()`은 하나의 인자(할당할 메모리의 크기, 바이트 단위)를 받는다.[11] 예를 들어, 크기가 10인 정수형 배열을 동적으로 할당하려면 다음과 같이 코드를 작성할 수 있다.

```c

int *array = malloc(10 * sizeof(int));

```

이 코드는 10개의 정수가 메모리에서 차지하는 바이트 수를 계산한 다음, `malloc`에 해당 바이트 수만큼 요청하고 결과를 `array`라는 포인터에 할당한다. C 구문에서 포인터와 배열은 특정 상황에서 서로 바꿔서 사용할 수 있다.

`malloc`은 요청을 처리하지 못할 수도 있으므로 널 포인터를 반환할 수 있으며, 이를 확인하는 것이 좋은 프로그래밍 방식이다.

```c

int *array = malloc(10 * sizeof(int));

if (array == NULL) {

fprintf(stderr, "malloc failed\n");

return -1;

}

```

프로그램이 더 이상 동적 배열이 필요하지 않으면, `free`를 호출하여 메모리를 해제해야 한다.

```c

free(array);

```

`malloc`에 의해 할당된 메모리는 초기화되지 않으며, 이전에 사용하고 버려진 데이터의 잔여물인 쓰레기 값을 포함할 수 있다. 따라서 `malloc`으로 할당한 후, 배열의 요소는 초기화되지 않은 변수이다.[1]

3. 2. `calloc`

`calloc`은 지정된 개수와 크기의 요소를 위한 메모리 블록을 할당하고, 이를 0으로 초기화한다.[1]

`malloc()`은 하나의 인자(할당할 메모리의 크기, 바이트 단위)를 받지만, `calloc()`은 두 개의 인자, 즉 요소의 개수와 각 요소의 크기를 받는다.

`malloc()`은 메모리 할당만 수행하는 반면, `calloc()`은 메모리를 할당하고 할당된 영역의 바이트를 0으로 초기화한다.[11]

3. 3. `realloc`

지정된 메모리 블록의 크기를 늘리거나 줄이며, 필요한 경우 메모리를 이동한다.[1]

3. 4. `free`

c

free(array);

```

`free` 함수는 `malloc`으로 할당된 메모리를 해제하여 자유 저장소에 반환한다. free영어 함수는 지정된 메모리 블록을 시스템에 반환하는 역할을 한다.[1]

3. 5. 사용 예시

C에서 자동 범위를 가진 10개의 정수 배열을 생성하는 것은 간단하다.

```c

int array[10];

```

그러나 배열의 크기는 컴파일 시간에 고정된다. C11 구현에서 모두 지원이 보장되지 않는 가변 길이 배열을 사용하지 않고 유사한 배열을 동적으로 할당하려면 다음 코드를 사용할 수 있다.

```c

int *array = malloc(10 * sizeof(int));

```

이 코드는 10개의 정수가 메모리에서 차지하는 바이트 수를 계산한 다음, `malloc`에서 해당 바이트 수만큼 요청하고 결과를 `array`라는 포인터에 할당한다. C 구문으로 인해 포인터와 배열은 특정 상황에서 상호 교환하여 사용할 수 있다.

`malloc`은 요청을 처리하지 못할 수도 있으므로 널 포인터를 반환할 수 있으며, 이를 확인하는 것이 좋은 프로그래밍 방식이다.

```c

int *array = malloc(10 * sizeof(int));

if (array == NULL) {

fprintf(stderr, "malloc failed\n");

return -1;

}

```

프로그램이 더 이상 동적 배열이 필요하지 않으면, `free`를 호출하여 메모리를 해제하여 자유 저장소에 반환해야 한다.

```c

free(array);

```

`malloc`에 의해 할당된 메모리는 초기화되지 않으며, 이전에 사용하고 버려진 데이터의 잔여물인 쓰레기 값을 포함할 수 있다. `malloc`으로 할당한 후, 배열의 요소는 초기화되지 않은 변수이다. `calloc` 명령은 이미 지워진 할당을 반환한다.

```c

int *array = calloc(10, sizeof(int));

```

`realloc`을 사용하면 포인터가 가리키는 메모리 양의 크기를 조정할 수 있다. 예를 들어, 크기가 n인 배열 역할을 하는 포인터가 있고, 이를 크기 m인 배열로 변경하려면 `realloc`을 사용할 수 있다.

```c

int *arr = malloc(2 * sizeof(int));

arr[0] = 1;

arr[1] = 2;

arr = realloc(arr, 3 * sizeof(int));

arr[2] = 3;

```

`realloc`은 블록의 기본 주소를 변경한 것으로 간주해야 한다. 즉, 원래 블록의 크기를 확장하지 못하고 다른 곳에 새로운 더 큰 블록을 할당하고 이전 내용을 복사한 경우, 원래 블록 내의 주소에 대한 포인터는 더 이상 유효하지 않다.

4. 구현 방식

C 프로그래밍 언어는 메모리를 정적, 자동, 동적으로 관리한다. 정적 변수는 프로그램 실행 코드와 함께 주 메모리에 할당되어 프로그램 수명 동안 지속된다. 자동 변수는 스택에 할당되며 함수 호출 및 반환 시 생성 및 소멸된다. 정적 및 자동 변수의 할당 크기는 컴파일 타임에 결정되어야 한다.[5] 런타임까지 크기를 알 수 없는 경우(예: 사용자 입력 데이터)에는 고정 크기 데이터 객체를 사용할 수 없다.

메모리 수명 또한 중요한 문제이다. 자동 할당된 데이터는 여러 함수 호출에 걸쳐 유지될 수 없고, 정적 데이터는 필요 여부와 관계없이 프로그램 수명 동안 유지된다. 따라서 프로그래머는 메모리 수명을 유연하게 관리할 필요가 있으며, 이러한 제한은 동적 메모리 할당을 통해 해결된다.

동적 메모리 할당은 메모리를 보다 명시적이지만 유연하게 관리하며, 일반적으로 ""이라고 불리는 메모리 영역에서 할당된다. C에서는 `malloc` 함수를 사용하여 힙에 메모리 블록을 할당하고, `free` 함수를 사용하여 해제한다.[6] C의 초기 설명에는 `malloc` 대신 `calloc`과 `cfree`가 표준 라이브러리에 있었다.[7] 유닉스 6판 문서는 `alloc`과 `free`를 로우 레벨 메모리 할당 함수로 제공한다.[8][9] 현대적인 `malloc`과 `free`는 유닉스 7판 매뉴얼에 설명되어 있다.

일부 플랫폼은 힙이 아닌 C 스택에서 런타임 동적 할당을 허용하는 라이브러리나 내장 함수 호출(예: `alloca()`)을 제공한다.[10] 이 메모리는 호출 함수가 종료될 때 자동으로 해제된다.

메모리 관리 구현은 운영 체제 및 아키텍처에 따라 다르다. 일부 운영 체제는 `malloc`을 위한 할당자를 제공하고, 다른 운영 체제는 특정 데이터 영역을 제어하는 함수를 제공한다. 동일한 동적 메모리 할당자가 C++에서 `malloc`과 `new` 연산자를 모두 구현하는 데 사용되기도 한다.[20]

4. 1. 힙 기반 할당

레거시 할당기는 일반적으로 힙 세그먼트를 사용하여 구현되었으며, 할당 요청에 따라 힙을 확장하고 축소하는 방식으로 동작한다.[20]

힙 방식은 몇 가지 고유한 결함을 가지고 있다.

  • 선형 할당자는 마지막 할당이 해제된 경우에만 축소할 수 있다. 힙 끝부분의 작지만 오래 지속되는 할당으로 인해 힙이 매우 큰 크기로 "고정"될 수 있으며, 이는 많은 주소 공간 낭비로 이어질 수 있다.
  • 선형 할당자는 단편화에 민감하다.
  • 선형 할당자는 동시성 특성이 좋지 않다. 힙 세그먼트는 프로세스당 하나이므로 모든 스레드는 할당 시 동기화해야 한다.


각 스레드는 작은 할당을 위한 스레드 로컬 저장소를 가질 수 있다. 큰 할당의 경우, mmap 또는 sbrk를 사용할 수 있다. 구글(Google)에서 개발한 TCMalloc은 죽은 스레드의 로컬 저장소를 위한 가비지 수집 기능이 있으며, 다중 스레드 프로그램에서 glibc의 ptmalloc보다 두 배 이상 빠르다고 알려져 있다.[20]

dlmalloc, jemalloc, Hoard, mimalloc 등 다양한 힙 기반 할당 알고리즘이 존재한다.

4. 1. 1. dlmalloc

더그 리아는 1987년부터 범용 할당기로 퍼블릭 도메인 dlmalloc("Doug Lea's Malloc")을 개발했다.[21][22][23] 2023년 11월 현재, dlmalloc의 최신 버전은 2012년 8월에 출시된 버전 2.8.6이다.[24]

dlmalloc은 경계 태그 할당기이다. 힙 메모리의 메모리는 헤더와 사용 가능한 메모리를 포함하는 8바이트 데이터 구조 정렬 데이터 구조인 "청크"로 할당된다. 할당된 메모리에는 청크 크기 및 사용 플래그에 대한 8바이트 또는 16바이트 오버헤드가 포함된다 (도프 벡터와 유사). 할당되지 않은 청크는 사용 가능한 공간 영역에서 다른 사용 가능한 청크에 대한 포인터를 저장하므로 최소 청크 크기는 32비트 시스템에서 16바이트이고 64비트 시스템에서 24/32바이트(정렬에 따라 다름)이다.[22][24]

할당되지 않은 메모리는 청크의 이중 연결 목록을 사용하여 구현된 비슷한 크기의 "빈"으로 그룹화된다(청크 내 할당되지 않은 공간에 포인터가 저장됨). 빈은 크기별로 세 가지 클래스로 정렬된다:[22][24]

  • 256바이트 미만의 요청("smallbin" 요청)의 경우 간단한 2의 거듭제곱 최적 적합 할당기가 사용된다. 해당 빈에 사용 가능한 블록이 없으면 다음으로 높은 빈의 블록이 두 개로 분할된다.
  • 256바이트 이상이지만 mmap 임계값 미만의 요청의 경우 dlmalloc은 v2.8.0부터 인플레이스 ''비트 단위 트라이'' 알고리즘("treebin")을 사용한다. 요청을 충족할 사용 가능한 공간이 없으면 dlmalloc은 일반적으로 brk 시스템 호출을 통해 힙 크기를 늘리려고 시도한다. 이 기능은 ptmalloc이 생성된 훨씬 후에 도입되었으며(v2.7.x부터) 그 결과 오래된 최적 적합 할당기를 상속하는 glibc의 일부가 아니다.
  • mmap 임계값 이상의 요청("largebin" 요청)의 경우 메모리는 항상 mmap 시스템 호출을 사용하여 할당된다. 임계값은 일반적으로 128KB이다.[25] mmap 방식은 만료 후 끝 부분에서 작은 할당을 가두는 거대한 버퍼의 문제를 방지하지만 항상 메모리의 전체 페이지를 할당하며, 많은 아키텍처에서 40,960억이다.[26]

4. 1. 2. jemalloc

프리BSD 7.0 및 넷BSD 5.0부터, 이전의 `malloc` 구현체 (폴-헤닝 캠프의 phkmalloc)는 제이슨 에반스가 작성한 [http://jemalloc.net/ jemalloc]으로 대체되었다. 주된 이유는 phkmalloc이 다중 스레딩 환경에서 확장성이 부족했기 때문이다. jemalloc은 락 경합을 피하기 위해 각 CPU에 대해 별도의 "아레나"를 사용한다. 다중 스레딩 응용 프로그램에서 초당 할당 횟수를 측정한 실험 결과, phkmalloc과 dlmalloc은 스레드 수에 반비례하는 성능을 보인 반면, jemalloc은 스레드 수에 따라 선형적으로 확장되는 것으로 나타났다.[28]

4. 1. 3. Hoard

Hoard는 확장 가능한 메모리 할당 성능을 목표로 하는 메모리 할당자이다. Hoard는 `mmap`을 독점적으로 사용하며, 슈퍼블록이라는 64킬로바이트 덩어리로 메모리를 관리한다.

오픈BSD의 `malloc` 함수 구현은 mmap을 활용한다. 한 페이지보다 큰 크기의 요청에 대해서는 전체 할당이 `mmap`을 사용하여 검색된다. 더 작은 크기는 `mmap`으로 할당된 여러 "버킷 페이지" 내에서 `malloc`에 의해 유지 관리되는 메모리 풀에서 할당된다.[29] `free`를 호출하면 메모리가 해제되고 `munmap`을 사용하여 프로세스 주소 공간에서 맵핑이 해제된다. 이 시스템은 OpenBSD의 `mmap` 시스템 콜의 일부로 구현된 주소 공간 배치 무작위화 및 갭 페이지 기능을 활용하고, 사용 후 해제 버그를 감지하도록 설계되었다. 큰 메모리 할당은 해제된 후 완전히 맵핑이 해제되므로, 추가 사용은 세그멘테이션 오류와 프로그램 종료를 유발한다.

GrapheneOS 프로젝트는 처음에 OpenBSD의 메모리 할당자를 Android의 Bionic C 라이브러리로 포팅하는 것으로 시작했다.[30]

4. 1. 4. TCMalloc

주어진 원본 소스에 TCMalloc에 대한 정보가 없으므로, 해당 섹션은 작성할 수 없습니다. 이전 답변과 동일합니다.

4. 1. 5. mimalloc

마이크로소프트 연구소(Microsoft Research)에서 개발한, 성능에 중점을 둔 오픈 소스의 작고 범용적인 메모리 할당자이다.[32] 이 라이브러리는 약 11,000 코드 줄로 구성되어 있다.

4. 2. 커널 내 할당

운영 체제 커널은 응용 프로그램과 마찬가지로 메모리를 할당해야 한다. 그러나 커널 내 `malloc`의 구현은 C 라이브러리에서 사용되는 구현과 크게 다를 수 있다. 예를 들어, 메모리 버퍼는 DMA로 인해 부과된 특별한 제약 조건을 준수해야 하거나, 인터럽트 컨텍스트에서 메모리 할당 함수가 호출될 수 있다.[36] 따라서 운영 체제 커널의 가상 메모리 하위 시스템과 긴밀하게 통합된 `malloc` 구현이 필요하다.

5. 일반적인 오류 및 주의 사항

동적 메모리 할당을 잘못 사용하면 세그멘테이션 오류를 포함한 보안 버그나 프로그램 충돌과 같은 다양한 문제가 발생할 수 있다.[15]

흔히 발생하는 오류는 다음과 같다:


  • 할당 실패 확인 부족: 메모리 할당은 실패할 수 있으며, 이 경우 널 포인터를 반환한다.
  • 메모리 누수: `free` 함수로 메모리를 해제하지 않으면 메모리가 낭비되고, 결국 할당 실패로 이어질 수 있다.
  • 논리적 오류: `malloc` 함수로 할당, 사용, `free` 함수로 해제하는 패턴을 지키지 않으면 오류가 발생한다. 예를 들어 `free` 호출 후 메모리를 사용하거나(`댕글링 포인터`), `malloc` 호출 전에 메모리를 사용하거나(`와일드 포인터`), `free`를 두 번 호출하는 경우(이중 해제)가 있다.
  • 크기 0 할당: 크기가 0인 메모리 할당은 `malloc` 및 관련 함수에서 문제를 일으킬 수 있으며, 2019년 WhatsApp RCE의 원인이 되기도 했다.[18]


이러한 오류는 발견하고 수정하기 어려울 수 있다.[15]

5. 1. 할당 실패 확인 부족

`malloc` 등의 함수는 메모리 할당에 실패하면 널 포인터를 반환할 수 있다. 할당 성공 여부를 확인하지 않고 반환된 값을 사용하면 정의되지 않은 동작이 발생한다. 이는 일반적으로 (널 포인터 역참조로 인한 세그멘테이션 오류) 충돌로 이어지지만, 충돌이 반드시 발생한다는 보장은 없으므로 이에 의존하는 것은 문제를 야기할 수 있다.[15]

5. 2. 메모리 누수

`free`를 사용하여 메모리를 해제하지 못하면 재사용할 수 없는 메모리가 축적되어 프로그램에서 더 이상 사용되지 않는다. 이는 메모리 리소스를 낭비하고 이러한 리소스가 소진되면 할당 실패로 이어질 수 있다.[15]

5. 3. 논리적 오류

모든 할당은 `malloc`을 사용한 할당, 데이터를 저장하기 위한 사용, `free`를 사용한 해제와 같은 동일한 패턴을 따라야 한다. 이 패턴을 따르지 않으면 일반적으로 세그멘테이션 오류가 발생하고 프로그램이 충돌한다. 이러한 오류는 다음과 같다.[15]

  • `free` 호출 후 메모리 사용(댕글링 포인터)
  • `malloc` 호출 전 메모리 사용(와일드 포인터)
  • `free`를 두 번 호출("이중 해제")


이러한 오류는 일시적일 수 있으며 디버그하기 어려울 수 있다. 예를 들어, 해제된 메모리는 일반적으로 OS에서 즉시 회수되지 않으므로 댕글링 포인터가 잠시 동안 지속되고 작동하는 것처럼 보일 수 있다.[15]

5. 4. 크기 0 할당

ANSI C 표준화 이전의 인터페이스로서 `malloc` 및 관련 함수는 자체적으로 정의하도록 의도적으로 남겨둔 동작을 가지고 있다. 그중 하나는 0 길이 할당인데, 이는 0으로 크기를 조정하는 것이 더 일반적이기 때문에 `realloc`에서 더 큰 문제이다.[16] POSIX와 Single Unix Specification 모두 `NULL`을 반환하거나 안전하게 해제할 수 있는 다른 것을 반환하여 0 크기 할당을 적절하게 처리해야 하지만,[17] 모든 플랫폼이 이러한 규칙을 준수해야 하는 것은 아니다. 이로 인해 발생한 많은 이중 해제 오류 중에서 2019년 WhatsApp RCE가 특히 두드러졌다.[18] 이러한 함수를 더 안전하게 래핑하는 방법은 0 크기 할당을 확인하고 크기 1로 변환하는 것이다. ( `NULL`을 반환하는 것은 자체적인 문제가 있다. 그렇지 않으면 메모리 부족 실패를 나타낸다. `realloc`의 경우 원래 메모리가 이동되고 해제되지 않았음을 알렸을 것이며, 이는 다시 크기 0의 경우가 아니므로 이중 해제로 이어진다.)[19]

6. 타입 안전성

`malloc`은 void 포인터(`void *`)를 반환하는데, 이는 알 수 없는 데이터 형식의 영역을 가리키는 포인터임을 나타낸다. C++에서는 강력한 형식 시스템 때문에 형 변환(캐스팅)을 사용해야 하지만, C에서는 그렇지 않다. 이 포인터를 특정 형식으로 형 변환(형 변환 참조)할 수 있다.

```c

int *ptr, *ptr2;

ptr = malloc(10 * sizeof(*ptr)); /* 캐스팅 없이 */

ptr2 = (int *)malloc(10 * sizeof(*ptr)); /* 캐스팅 사용 */

```

이러한 형 변환에는 장단점이 있다.

장점단점


7. 확장 및 대안

표준 `malloc` 인터페이스 외에도 다양한 확장 및 대안이 존재한다.


  • `alloca`는 호출 스택에 요청된 바이트 수를 할당한다. 일반적으로 호출 함수가 반환되는 즉시 메모리가 할당 해제되므로 해당 할당 해제 함수는 없다. `alloca`는 32/V(1978)와 같이 초창기 유닉스 시스템에 존재했지만 일부 환경에서는 사용에 문제가 있을 수 있다.[38] 많은 컴파일러에서 지원하지만, ANSI-C 표준의 일부가 아니므로 항상 이식성이 있는 것은 아니다. 또한 약간의 성능 문제를 일으킬 수 있다. 가변 크기 스택 프레임을 사용하므로 스택 및 프레임 포인터를 모두 관리해야 한다(고정 크기 스택 프레임의 경우 이 중 하나는 중복됨).[39] 더 큰 할당은 스택 오버플로우로 인해 정의되지 않은 동작의 위험을 증가시킬 수도 있다.[40]
  • POSIX는 호출자가 지정한 정렬로 메모리를 할당하는 `posix_memalign` 함수를 정의한다. 할당은 `free`로 할당 해제된다.[41]


`malloc`과 관련된 함수들은 프로그램의 성능에 큰 영향을 미칠 수 있기 때문에, 특정 애플리케이션의 할당 패턴에 최적화된 사용자 정의 구현으로 해당 함수들을 재정의하는 경우가 많다. C 표준은 이러한 방법을 제공하지 않지만, 운영 체제는 동적 연결을 활용하여 이를 수행하는 다양한 방법을 찾아냈다. POSIX 계열 시스템에서 가장 흔한 형태는 환경 변수 `LD_PRELOAD`를 할당기의 경로로 설정하여, 동적 링커가 libc 구현 대신 해당 버전의 `malloc`/`calloc`/`free`를 사용하도록 하는 것이다.

참조

[1] 간행물 7.20.3 Memory management functions http://www.open-std.[...]
[2] 웹사이트 Chapter 11: Memory Allocation http://www.eskimo.co[...] 2020-07-11
[3] 웹사이트 aligned_alloc(3) - Linux man page https://linux.die.ne[...]
[4] 서적 Programming: Principles and Practice Using C++ Addison Wesley
[5] 웹사이트 gcc manual https://gcc.gnu.org/[...] gnu.org 2008-12-14
[6] 문서 The C Programming Language Prentice-Hall
[7] 문서 alloc man
[8] 문서 malloc man
[9] 문서 Unix Programmer's Manual, Vol. 1 Holt Rinehart and Winston
[10] 문서 alloca man
[11] 문서 calloc man
[12] 웹사이트 Casting malloc http://faq.cprogramm[...] Cprogramming.com 2007-03-09
[13] 웹사이트 clang: lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp Source File http://clang.llvm.or[...] 2018-04-01
[14] 웹사이트 comp.lang.c FAQ list · Question 7.7b http://www.c-faq.com[...] C-FAQ 2007-03-09
[15] 서적 Pointers on C Pearson 1997-08-04
[16] 웹사이트 MEM04-C. Beware of zero-length allocations - SEI CERT C Coding Standard - Confluence https://wiki.sei.cmu[...]
[17] 웹사이트 POSIX.1-2017: malloc https://pubs.opengro[...] 2019-11-29
[18] 웹사이트 How a double-free bug in WhatsApp turns to RCE https://awakened1712[...] 2019-11-29
[19] 트윗 Wow. The WhatsApp RCE was the wrong behavior for realloc(p,0) so many implementations insist on. 2022-08-06
[20] 서적 Modern C++ Design: Generic Programming and Design Patterns Applied Addison-Wesley
[21] 웹사이트 Wolfram Gloger's malloc homepage http://malloc.de/en/ 2018-04-01
[22] 학술지 Vudo malloc tricks http://phrack.org/is[...] 2009-04-29
[23] 웹사이트 Glibc: Malloc Internals https://sourceware.o[...] 2019-12-01
[24] 웹사이트 A Memory Allocator http://gee.cs.oswego[...] 2019-12-01
[25] 웹사이트 Malloc Tunable Parameters https://www.gnu.org/[...] GNU 2009-05-02
[26] 웹사이트 RAM, Virtual Memory, Pagefile and all that stuff http://support.micro[...] Microsoft Help and Support 2004-12-12
[27] 웹사이트 The Hole That dlmalloc Can't Fill http://gameangst.com[...] 2019-12-01
[28] 웹사이트 A Scalable Concurrent malloc(3) Implementation for FreeBSD http://people.freebs[...] 2012-03-18
[29] 웹사이트 libc/stdlib/malloc.c http://bxr.su/OpenBS[...]
[30] 웹사이트 History https://grapheneos.o[...] 2023-03-02
[31] 컨퍼런스 Hoard: A Scalable Memory Allocator for Multithreaded Applications http://www.cs.umass.[...] 2000-11
[32] 웹사이트 Microsoft releases optimized malloc() as open source - Slashdot https://slashdot.org[...] 2020-07-04
[33] 웹사이트 TCMalloc homepage "//code.google.com/p[...]
[34] 문서 TCMalloc : Thread-Caching Malloc http://goog-perftool[...]
[35] 웹사이트 High Availability MySQL: Double sysbench throughput with TCMalloc http://mysqlha.blogs[...] 2011-09-18
[36] 웹사이트 kmalloc()/kfree() include/linux/slab.h http://people.netfil[...] 2011-09-18
[37] 웹사이트 malloc: make malloc fail with requests larger than PTRDIFF_MAX https://sourceware.o[...] 2019-04-18
[38] 웹사이트 Why is the use of alloca() not considered good practice? https://stackoverflo[...] 2016-01-05
[39] 웹사이트 6.172 Performance Engineering of Software Systems, Lecture 10 http://ocw.mit.edu/c[...] Massachusetts Institute of Technology 2015-01-27
[40] 웹사이트 alloca(3) - Linux manual page http://man7.org/linu[...] 2016-01-05
[41] 문서 sh
[42] 서적 ISO/IEC 9899:1999 specification http://www.open-std.[...]
[43] 서적 Advanced C Programming Technical Publications
[44] 웹인용 C Programming Notes - Chapter 11: Memory Allocation http://c-faq.com/~sc[...] 2011-10-30
[45] 서적 Programming: Principles and Practice Using C++ Addison Wesley



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com