C 동적 메모리 할당

C dynamic memory allocation

C 동적 메모리 할당은 C 표준 라이브러리의 함수 그룹, malloc, realloc, calloc[1][2]free를 통해 C 프로그래밍 언어로 동적 메모리 할당을 위한 수동 메모리 관리를 수행하는 을 의미합니다.

C++ 프로그래밍 언어에는 이러한 기능이 포함되어 있지만, 연산자 new와 delete는 유사한 기능을 제공하며 해당 언어의 [3]작성자가 권장하는 바입니다.그러나, 를 사용하는 경우는, 몇개인가 있습니다.new/delete가비지 수집 코드나 퍼포먼스에 민감한 코드, 및 의 조합은 적용되지 않습니다.malloc및 배치new더 높은 레벨 대신 필요할 수 있습니다.new교환입니다.

malloc에 의해 사용되는 실제 메모리 할당 메커니즘의 다양한 구현을 사용할 수 있습니다.퍼포먼스는 실행 시간과 필요한 메모리 양쪽에 따라 달라집니다.

근거

C 프로그래밍 언어는 메모리를 정적, 자동 또는 동적으로 관리합니다.정적 기간 변수는 보통 프로그램의 실행 가능 코드와 함께 메인 메모리에 할당되며 프로그램의 수명 동안 지속됩니다. 자동 기간 변수는 함수가 호출되고 반환될 때 스택에 할당되고 오고 갑니다.정적 지속 시간 및 자동 지속 시간 변수의 경우 할당 크기는 컴파일 시간 상수여야 합니다(변수 길이[4] 자동 배열의 경우 제외).런타임까지 필요한 크기를 알 수 없는 경우(예를 들어 임의의 크기의 데이터를 사용자 또는 디스크 파일에서 읽는 경우) 고정 크기의 데이터 개체를 사용하는 것은 적절하지 않습니다.

할당된 메모리의 수명도 문제를 일으킬 수 있습니다.정적 메모리도 자동 지속 메모리도 모든 상황에 적합하지 않습니다.자동 할당된 데이터는 여러 함수 호출에 걸쳐 유지될 수 없지만 정적 데이터는 필요 여부에 관계없이 프로그램 수명 동안 유지됩니다.대부분의 경우 프로그래머는 할당된 메모리의 수명을 관리하는 데 더 많은 유연성을 필요로 합니다.

이러한 제한은 동적 메모리 할당을 사용함으로써 회피됩니다.이 경우 메모리를 보다 명시적으로(그러나 보다 유연하게) 관리할 수 있습니다.일반적으로 이 목적을 위해 구성된 메모리 영역인 프리스토어(비공식적으로 "히프"[citation needed]라고 불립니다)에서 메모리를 할당합니다.C에서 라이브러리 기능malloc는, 히프에 메모리 블록을 할당하기 위해서 사용됩니다.프로그램은 다음 포인터를 통해 이 메모리 블록에 액세스합니다.malloc돌아온다.메모리가 필요 없게 되면 포인터는 다음 주소로 전달됩니다.free메모리 할당을 해제하여 다른 용도로 사용할 수 있도록 합니다.

C의 원래 설명에는 다음과 같은 내용이 기재되어 있습니다.calloc그리고.cfree표준 도서관에 있었지만,mallocUnix용 스토리지 매니저의 간단한 모델 구현에 대한 코드는 다음과 같이 제공되었습니다.alloc그리고.free사용자 인터페이스의 기능에 따라sbrkoperating [5]system으로부터 메모리를 요구하기 위한 시스템 호출.6th Edition Unix 매뉴얼에서는alloc그리고.free낮은 수준의 메모리 할당 [6]기능으로 사용됩니다.malloc그리고.free최신 형식의 루틴은 7 에디션 UNIX [7][8]매뉴얼에 자세히 설명되어 있습니다.

일부 플랫폼은 힙이 아닌 C 스택에서 런타임 동적 할당을 허용하는 라이브러리 또는 고유 함수 호출을 제공합니다(예:alloca()이 메모리는, 콜 기능이 종료하면 자동적으로 해방됩니다[9].

기능의 개요

C 동적 메모리 할당 함수는 다음과 같이 정의됩니다.stdlib.h헤더 (cstdlib헤더([1]C++)를 지정합니다.

기능. 묘사
malloc 지정된 바이트 수를 할당합니다.
realloc 지정된 메모리 블록의 크기를 늘리거나 줄입니다.필요에 따라 이동합니다.
calloc 지정된 바이트 수를 할당하고 0으로 초기화합니다.
free 지정된 메모리 블록을 시스템으로 되돌립니다.

의 차이점malloc()그리고.calloc()

  • malloc()는 단일 인수(바이트 단위로 할당하는 메모리 양)를 사용합니다.calloc()는 요소의 수와 각 요소의 크기라는2개의 인수를 사용합니다.
  • malloc()메모리만 할당하는 반면calloc()는 할당된 영역의 바이트를 0으로 [10]할당하고 설정합니다.

사용 예

C에서는 자동 스코프를 사용하여 10개의 정수로 이루어진 배열을 쉽게 작성할 수 있습니다.

인트 배열[10]; 

다만, 어레이의 사이즈는 컴파일시에 고정됩니다.같은 배열을 동적으로 할당하는 경우는, 다음의 코드를 사용할 수 있습니다.

인트 *배열 = 마로크(10 * 크기(인트)); 

이것은 메모리 내에서 10개의 정수가 차지하는 바이트 수를 계산하고 그 바이트 수를 요구합니다.malloc그리고 그 결과를 포인터에 할당한다.array(C 구문 때문에 포인터와 배열을 상황에 따라 자유롭게 사용할 수 있습니다).

왜냐면malloc는 요구를 처리하지 못할 수 있으며 늘포인터를 반환할 수 있습니다.이를 체크하는 것이 좋습니다.

인트 *배열 = 마로크(10 * 크기(인트)); 한다면 (배열 == 특수한 순서) {   인쇄(하드, "실패했습니다.\n");   돌아가다 -1; } 

프로그램이 다이내믹 어레이를 필요로 하지 않게 되면, 최종적으로 콜을 실시할 필요가 있습니다.free점유하고 있는 메모리를 프리 스토어로 되돌립니다.

공짜(배열); 

에 의해 확보된 메모리malloc초기화되지 않았으며 크러프트가 포함되어 있을 수 있습니다.즉, 이전에 사용한 데이터와 폐기된 데이터의 잔존물이 포함되어 있을 수 있습니다.할당 후malloc배열 요소는 초기화되지 않은 변수입니다.명령어calloc는 이미 클리어된 할당을 반환합니다.

인트 *배열 = 하드 디스크(10, 크기(인트)); 

재할당을 사용하면 포인터가 가리키는 메모리 용량을 조정할 수 있습니다.예를 들어 크기(\ n 배열로 기능하는 포인터가 있는데 이를 m(\ m의 배열로 변경하려면 재할당을 사용할 수 있습니다.

인트 *arr = 마로크(2 * 크기(인트)); arr[0] = 1; arr[1] = 2; arr = 재할당(arr, 3 * 크기(인트)); arr[2] = 3; 

재할당은 블록의 기본 주소를 변경한 것으로 간주해야 합니다(즉, 원래 블록의 크기를 확장하지 못하여 새로운 큰 블록을 다른 곳에 할당하고 오래된 내용을 여기에 복사한 경우).따라서 원래 블록 내의 주소에 대한 포인터도 더 이상 유효하지 않습니다.

형식 안전

mallocvoid 포인터를 반환합니다.(void *데이터 타입을 알 수 없는 영역에 대한 포인터임을 나타냅니다.C++에서는 강력한 타입 시스템으로 인해 주조 사용이 필요하지만, C에서는 그렇지 않습니다.이 포인터를 특정 타입으로 "캐스팅"할 수 있습니다(타입 변환 참조).

인트 *ptr, *ptr2; ptr = 마로크(10 * 크기(*ptr)); /* 깁스 없음 */ ptr2 = (인트 *)마로크(10 * 크기(*ptr)); /* 깁스 포함 */ 

이런 캐스팅을 하는 것에는 장점과 단점이 있다.

캐스팅의 장점

  • 캐스트를 포함하면 C 프로그램 또는 함수를 C++로 컴파일할 수 있습니다.
  • 출연진들은 1989년 이전 버전의malloc원래 반환된 것은char *를 클릭합니다.[11]
  • 캐스팅은 개발자가 대상 포인터 유형이 변경되었을 때, 특히 포인터가 먼 것으로 선언된 경우 유형 사이징의 불일치를 식별하는 데 도움이 될 수 있습니다.malloc()call (다만 최신 컴파일러 및 정적 분석기는 캐스팅을 요구하지[12] 않고 이러한 동작을 경고할 수 있습니다.)

캐스팅의 단점

  • C 표준에서는 캐스트는 용장성이 있습니다.
  • 캐스트를 추가하면 헤더를 포함시키지 못할 수 있습니다.stdlib.h의 기능 프로토타입은malloc검출되었습니다.[11][13]시제품이 없는 경우mallocC90 규격에서는 C 컴파일러가 다음 조건을 상정하고 있습니다.malloc반환하다int캐스트가 없는 경우 이 정수를 포인터에 할당할 때 C90에서는 진단이 필요하지만 캐스트를 사용하면 이 진단이 생성되지 않고 버그가 숨겨집니다.특정 아키텍처 및 데이터 모델(64비트 시스템의 LP64 등),long포인터는 64비트이고int이 에러는, 실제로는, 암묵적으로 선언된 대로 정의되지 않은 동작을 일으킬 가능성이 있습니다.malloc는 32비트 값을 반환하는 반면 실제 정의된 함수는 64비트 값을 반환합니다.호출 규칙 및 메모리 레이아웃에 따라 스택스매싱이 발생할 수 있습니다.C99는 암묵적인 선언을 허용하지 않기 때문에 이 문제는 최신 컴파일러에서 인식되지 않을 가능성이 낮습니다.따라서 컴파일러는 다음 조건을 충족하더라도 진단 프로그램을 생성해야 합니다.int돌아가다.
  • 선언 시 포인터의 타입이 변경되면 모든 행을 변경해야 할 수도 있습니다.malloc불러서 섭외합니다.

일반적인 오류

동적 메모리 할당의 부적절한 사용은 버그의 원인이 될 수 있습니다.여기에는 보안 버그나 프로그램 크래시가 포함될 수 있습니다.대부분의 경우 세그멘테이션 장애로 인해 발생합니다.

가장 일반적인 오류는 다음과 같습니다.[14]

할당 실패를 확인하지 않음
메모리 할당의 성공이 보장되지 않으며 대신 늘 포인터를 반환할 수 있습니다.할당이 성공했는지 확인하지 않고 반환된 값을 사용하면 정의되지 않은 동작이 호출됩니다.이는 보통 크래시로 이어지지만(null pointer dereference의 분할 장애로 인해) 크래시가 발생한다는 보장은 없기 때문에 크래시에 의존하면 문제가 발생할 수 있습니다.
메모리 누수
다음을 사용하여 메모리 할당 해제 실패free이 경우 프로그램에서 더 이상 사용되지 않는 비패킷 메모리가 축적됩니다.이로 인해 메모리 리소스가 낭비되고 리소스가 소진되면 할당 실패가 발생할 수 있습니다.
논리적 오류
모든 할당은 동일한 패턴을 따라야 합니다. 할당: 사용malloc, 데이터 저장에 사용, 할당 해제free에의 콜 후의 메모리 사용량 등, 이 패턴에 준거하고 있지 않은 경우.free(당글링 포인터) 또는 콜 전malloc(와일드 포인터), 호출free두 번("더블 프리") 등은 일반적으로 분할 오류를 일으키고 프로그램이 충돌합니다.이러한 에러는 일시적인 것으로, 디버깅이 어려운 경우가 있습니다.예를 들어 빈 메모리는 통상 OS에 의해 즉시 회수되지 않기 때문에, 행잉 포인터는 한동안 지속되어 동작하고 있는 것처럼 보일 수 있습니다.

또한 ANSI C 표준화에 선행하는 인터페이스로서malloc그 관련 기능에는, 스스로 정의하기 위해서 의도적으로 실장에 맡겨진 동작이 있습니다.그 중 하나는 제로렝스 할당으로, 이 할당은 더 큰 문제가 됩니다.realloc크기를 [15]0으로 조정하는 것이 일반적이기 때문입니다.POSIX와 싱글유닉스 사양 모두 0 사이즈의 할당을 적절히 처리할 필요가 있습니다만,NULL또는 안전하게 [16]해방할 수 있는 다른 것, 모든 플랫폼이 이러한 규칙을 준수할 필요는 없습니다.이로 인해 발생한 많은 더블 프리 오류 중 특히 2019 WhatsApp RCE가 [17]두드러졌습니다.이러한 기능을 보다 안전하게 정리하는 방법은 0 사이즈의 할당을 확인하고 1 사이즈의 할당으로 변경하는 것입니다.(돌아가기)NULL에는 독자적인 문제가 있습니다.그렇지 않으면 메모리 부족 장애를 나타냅니다.의 경우realloc원래 메모리가 이동 및 해방되지 않았음을 알 수 있습니다.이는 다시 사이즈0에 해당되지 않기 때문에 더블 프리가 됩니다).[18]

실장

메모리 관리의 실장은, operating system과 아키텍처에 의해서 크게 좌우됩니다.일부 운영 체제는 malloc용 할당기를 제공하는 반면, 다른 운영 체제는 특정 데이터 영역을 제어하는 기능을 제공합니다.동일한 동적 메모리 할당기가 두 가지 기능을 모두 구현하기 위해 자주 사용됩니다.malloc및 오퍼레이터newC++[19]로 표시됩니다.

히프 베이스

할당기 구현은 일반적으로 또는 데이터 세그먼트를 사용하여 수행됩니다.일반적으로 할당자는 할당 요청을 이행하기 위해 힙을 확장 및 축소합니다.

힙 메서드에는 플래그멘테이션으로 인해 발생하는 몇 가지 고유한 결함이 있습니다.다른 메모리 할당 방식과 마찬가지로 힙은 단편화됩니다.즉, 힙의 할당된 공간에 사용된 메모리와 사용되지 않은 메모리의 섹션이 있습니다.적절한 할당자는 히프를 확장하기 전에 이미 할당되어 있는 메모리의 미사용 영역을 찾으려고 합니다.이 방법의 가장 큰 문제는 힙에 중요한 속성이 2개뿐이라는 것입니다.기본값 또는 가상 메모리 공간 내의 힙 시작값과 길이 또는 크기입니다.힙은 전체 길이를 채우기에 충분한 시스템 메모리가 필요하며, 그 베이스는 절대 변경될 수 없습니다.따라서 사용되지 않는 메모리의 큰 영역이 낭비됩니다.힙의 끝에 사용된 작은 세그먼트가 존재하면 힙이 이 위치에 "고정"될 수 있으며, 이로 인해 주소 공간이 낭비될 수 있습니다.Linux 운영체제에서 흔히 볼 수 있는 것과 같은 느린 메모리 할당 방식에서는 큰 힙이 반드시 동등한 시스템 메모리를 예약하는 것은 아닙니다.첫 번째 쓰기 시에만 예약합니다(매핑되지 않은 메모리 페이지 읽기 시 0이 반환됩니다).상세도는 페이지 크기에 따라 달라집니다.

dlmalloc 및 ptmalloc

Doug Lea는 1987년부터 범용 할당자로 퍼블릭 도메인 dlmalloc("Doug Lea's Malloc")를 개발했습니다.GNU C 라이브러리(glibc)는 Wolfram Gloger의 ptmalloc("pthreads malloc")에서 파생되었습니다.이것은 스레드화 관련 기능 [20][21][22]향상을 수반하는 dlmalloc의 포크입니다.2019년 11월 현재 dlmalloc의 최신 버전은 2012년 [23]8월 이후 버전 2.8.6입니다.

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

할당되지 않은 메모리는 유사한 크기의 ""으로 그룹화되며 이중 링크된 청크 목록을 사용하여 구현됩니다(청크 내부의 할당되지 않은 공간에 포인터가 저장됨).빈은 크기별로 세 가지 [21][23]: Overlaid data structures 클래스로 정렬됩니다.

  • 256바이트 미만의 요구('smallbin' 요구)에는 단순한 2개의 전력 최적 할당기가 사용됩니다.빈칸에 빈 블록이 없는 경우 다음으로 높은 빈칸의 블록이 두 개로 분할됩니다.
  • 256바이트 이상 mmap 임계값보다 낮은 요구의 경우 v2.8.0 이후 dlmalloc에서는 in-place bitwise trie 알고리즘("treebin")을 사용합니다.요구를 만족시키기 위한 빈 공간이 남아 있지 않은 경우 dlmalloc은 보통 brk 시스템콜을 통해 힙의 크기를 늘리려고 합니다.이 기능은 ptmalloc이 작성된 후(v2.7.x부터) 도입되었습니다.그 결과, glibc의 일부가 아닙니다.glibc는 오래된 최적의 할당기를 상속합니다.
  • mmap 문턱값을 넘는 요구('대형 빈' 요구)의 경우 메모리는 항상 mmap 시스템콜을 사용하여 할당됩니다.임계값은 보통 256KB입니다.[24]mmap 메서드는 대용량 버퍼가 만료 후 마지막에 작은 할당량을 트랩하는 문제를 방지하지만 대부분의 아키텍처에서 [25]크기가 4096바이트인 메모리 페이지 전체를 항상 할당합니다.

게임 개발자인 Adrian Stone은 다음과 같이 주장한다.dlmalloc는 경계 태그 할당자로서 가상 메모리는 있지만 요구 페이징은 없는 콘솔시스템에 비우호적입니다.이는 풀 축소 및 증가 콜백(sysmalloc/systrim)을 사용하여 가상 메모리의 개별 페이지를 할당 및 커밋할 수 없기 때문입니다.요구 페이징이 없는 경우 플래그멘테이션이 더 [26]큰 문제가 됩니다.

FreeBSD 및 NetBSD의 젬마록

FreeBSD 7.0 및 NetBSD 5.0 이후 이전 버전에서는malloc구현(Poul-Henning Camp에 의한 phkmalloc)은 Jason Evans에 의해 쓰여진 jemalloc으로 대체되었습니다.그 주된 이유는 멀티스레딩 측면에서 phkmalloc의 확장성이 부족했기 때문이다.잠금 경합을 피하기 위해 젬알록은 CPU별로 별도의 "arenas"를 사용합니다.멀티스레딩 어플리케이션의 초당 할당 수를 측정한 실험에서 phkmalloc와 dlmalloc의 성능은 [27]모두 스레드 수에 반비례하는 것으로 나타났습니다.

OpenBSD의 malloc

OpenBSD의 구현malloc함수는 mmap을 사용합니다.두 페이지보다 큰 요청의 경우 전체 할당이 검색됩니다.mmap; 더 작은 사이즈는 에 의해 유지 보수되는 메모리 풀에서 할당됩니다.malloc또한 할당되는 다수의 "접속 페이지" 내에서mmap에의 [28][better source needed]문의로free메모리 해방 및 프로세스주소 공간 매핑 해제:munmapOpenB의 일부로 구현되는 주소 공간 레이아웃 랜덤화 및 갭 페이지 기능을 활용하여 보안성을 향상하는 시스템입니다.SD의mmap 시스템 콜 및 Use-After-free 버그를 검출하기 위해 메모리 할당이 해방된 후 매핑이 완전히 해제되기 때문에 더 이상 사용하면 세그멘테이션 장애 및 프로그램 종료가 발생합니다.

사재기 malloc

사재기는 확장 가능한 메모리 할당 성능을 목표로 하는 할당기입니다.OpenB처럼SD의 어로케이터, 사재기mmap배타적으로 메모리를 64킬로바이트 단위로 관리합니다.Hoard의 힙은 논리적으로 단일 글로벌 힙과 프로세서당 다수의 힙으로 나뉩니다.또한 제한된 수의 슈퍼블록을 저장할 수 있는 스레드 로컬 캐시가 있습니다.로컬 스레드 단위 또는 프로세서 단위 힙의 슈퍼 블록에서만 할당하고 거의 비어 있는 슈퍼 블록을 글로벌 힙으로 이동하여 다른 프로세서에서 재사용할 수 있도록 함으로써 Soard는 스레드 [29]수로 거의 선형에 가까운 확장성을 실현합니다.

미마록

퍼포먼스에 중점을 둔 Microsoft Research의 오픈 소스 콤팩트 범용 메모리 할당기.[30]도서관은 약 11,000줄의 코드입니다.

스레드 캐시 malloc(tcmalloc)

모든 스레드에는 소규모 할당을 위한 스레드 로컬 스토리지가 있습니다.대규모 할당의 경우 mmap 또는 sbrk를 사용할 수 있습니다.구글에 [31]의해 개발된 mallocTCMalloc은 데드 스레드의 로컬 저장을 위한 가비지 컬렉션을 가지고 있다.TCMalloc은 멀티스레드 프로그램의 [32][33]경우 glibc의 ptmalloc보다 2배 이상 빠른 것으로 간주됩니다.

DFMalloc

DFMalloc은 록 프리 기능을 채용한 설정이 용이한 malloc 라이브러리로, 엔터프라이즈 환경에 적합하도록 설계되어 있어 플래그멘테이션에 대해 견고하고 할당 공간의 런타임 검사가 가능합니다.

인커널

operating system의 커널에서는, 애플리케이션 프로그램과 같이 메모리를 할당할 필요가 있습니다.의 실장malloc그러나 커널 내에서는 종종 C 라이브러리에서 사용되는 구현과 크게 다릅니다.예를 들어 메모리 버퍼는 DMA에 의해 부과되는 특수한 제한에 준거할 필요가 있거나 인터럽트 [34]컨텍스트에서 메모리 할당 함수를 호출할 수 있습니다.이를 위해서는mallocoperating system 커널의 가상 메모리 서브시스템과 긴밀하게 통합된 구현입니다.

malloc 덮어쓰기

왜냐면malloc또, 그 관련성이 프로그램의 퍼포먼스에 큰 영향을 줄 수 있기 때문에, 애플리케이션의 할당 패턴에 최적화된 커스텀 실장에 의해서, 특정의 애플리케이션의 기능을 오버라이드 하는 것은 드문 일이 아닙니다.C 표준에서는 이 방법을 제공하지 않지만 운영체제는 동적 링크를 이용하여 다양한 방법을 찾아냈습니다.한 가지 방법은 단순히 다른 라이브러리에 링크하여 기호를 재정의하는 것입니다.Unix System V.3에 채용된 또 다른 방법은 다음과 같습니다.malloc그리고.free응용 프로그램이 사용자 지정 [35]함수로 재설정할 수 있는 함수 포인터입니다.

할당 크기 제한

가능한 최대 메모리 블록malloc는 호스트 시스템, 특히 물리 메모리의 크기와 운영 체제의 실장에 따라 할당할 수 있습니다.

이론적으로 가장 큰 숫자는 1개의 데이터 센터 내에서 유지할 수 있는 최대값이어야 합니다.size_ttype: 메모리 영역의 크기를 나타내는 구현 의존적인 부호 없는 정수입니다.C99 표준 이후에서는, 이 기능은SIZE_MAX에서 일정한.<stdint.h>ISO C에 의해 보장되지는 않지만 일반적으로 다음과 같습니다.2^(CHAR_BIT * sizeof(size_t)) - 1.

glibc 시스템에서 가능한 최대 메모리 블록malloccan allocate는 이 크기의 절반밖에 되지 않습니다.2^(CHAR_BIT * sizeof(ptrdiff_t) - 1) - 1를 클릭합니다.[36]

확장 기능 및 대체 기능

다양한 운영 체제 및 컴파일러와 함께 제공되는 C 라이브러리 구현에는 표준 대체 및 확장 기능이 포함되어 있을 수 있습니다.malloc인터페이스입니다.이 중 주목할 만한 것은 다음과 같습니다.

  • alloca 스택에 요청된 바이트 수를 할당합니다.대응하는 할당 해제 함수는 존재하지 않습니다.일반적으로 호출 함수가 반환되는 즉시 메모리가 할당 해제되기 때문입니다. alloca는, 32/V(1978년)부터 UNIX 시스템에 존재했지만, 일부의 콘텍스트([37]임베디드등)에서는 그 사용에 문제가 있을 가능성이 있습니다.많은 컴파일러에서 지원되지만 ANSI-C 표준의 일부가 아니기 때문에 항상 휴대할 수 있는 것은 아닙니다.또한 경미한 퍼포먼스 문제도 발생할 수 있습니다.즉, 가변 사이즈의 스택프레임으로 이어지기 때문에 스택과 프레임포인터를 모두 관리할 필요가 있습니다(고정 사이즈의 스택프레임에서는 이들 중 하나가 [38]용장합니다).할당이 클수록 스택 [39]오버플로로 인해 정의되지 않은 동작이 발생할 위험도 커질 수 있습니다.C99는 가변장 어레이를 대체 스택 할당 메커니즘으로 제공했지만, 이 기능은 이후 C11 표준에서는 옵션으로 한정되었습니다.
  • POSIX는 함수를 정의합니다.posix_memalign발신자 지정 얼라인먼트로 메모리를 할당합니다.그 할당은 다음과 같이 할당 해제됩니다.free따라서 구현은 보통 malloc 라이브러리의 일부여야 합니다.[40]

「 」를 참조해 주세요.

레퍼런스

  1. ^ a b 7.20.3 Memory management functions (PDF). ISO/IEC 9899:1999 specification. p. 313.
  2. ^ Summit, Steve. "Chapter 11: Memory Allocation". C Programming Notes. Retrieved 2020-07-11.
  3. ^ Stroustrup, Bjarne (2008). Programming: Principles and Practice Using C++. Addison Wesley. p. 1009. ISBN 978-0-321-54372-1.
  4. ^ "gcc manual". gnu.org. Retrieved 2008-12-14.
  5. ^ 브라이언 W. 커니건, 데니스 M.Ritchie, The C Programming Language, 프렌티스 홀, 1978; 섹션 7.9 (156페이지)는 다음을 설명합니다.calloc그리고.cfree, 및 섹션 8.7(173페이지)에서는, 의 실장에 대해 설명합니다.alloc그리고.free.
  6. ^ alloc(3)버전 6 Unix 프로그래머 매뉴얼
  7. ^ malloc(3)버전 7 Unix 프로그래머 매뉴얼
  8. ^ Anonymous, Unix Programmer's Manual, Vol.1, Holt Rinehart 및 Winston, 1983(저작권 보유, 1983, 1979).man호출하다.malloc275페이지에 기재되어 있습니다.
  9. ^ alloca(3)FreeBSD 라이브러리 기능 매뉴얼
  10. ^ https://linux.die.net/man/3/calloc
  11. ^ a b "Casting malloc". Cprogramming.com. Retrieved 2007-03-09.
  12. ^ "clang: lib/StaticAnalyzer/Checkers/MallocSizeofChecker.cpp Source File". clang.llvm.org. Retrieved 2018-04-01.
  13. ^ "comp.lang.c FAQ list · Question 7.7b". C-FAQ. Retrieved 2007-03-09.
  14. ^ Reek, Kenneth (1997-08-04). Pointers on C (1 ed.). Pearson. ISBN 9780673999863.
  15. ^ "MEM04-C. Beware of zero-length allocations - SEI CERT C Coding Standard - Confluence". wiki.sei.cmu.edu.
  16. ^ "POSIX.1-2017: malloc". pubs.opengroup.org. Retrieved 2019-11-29.
  17. ^ Awakened (2019-10-02). "How a double-free bug in WhatsApp turns to RCE". Retrieved 2019-11-29.
  18. ^ Felker, Rich [@RichFelker] (2019-10-03). "Wow. The WhatsApp RCE was the wrong behavior for realloc(p,0) so many implementations insist on" (Tweet). Retrieved 2022-08-06 – via Twitter.
  19. ^ Alexandrescu, Andrei (2001). Modern C++ Design: Generic Programming and Design Patterns Applied. Addison-Wesley. p. 78.
  20. ^ "Wolfram Gloger's malloc homepage". malloc.de. Retrieved 2018-04-01.
  21. ^ a b c Kaempf, Michel (2001). "Vudo malloc tricks". Phrack (57): 8. Archived from the original on 2009-01-22. Retrieved 2009-04-29.
  22. ^ "Glibc: Malloc Internals". sourceware.org Trac. Retrieved 2019-12-01.
  23. ^ a b c Lee, Doug. "A Memory Allocator". Retrieved 2019-12-01. 소스 코드용 HTTP
  24. ^ "Malloc Tunable Parameters". GNU. Retrieved 2009-05-02.
  25. ^ Sanderson, Bruce (2004-12-12). "RAM, Virtual Memory, Pagefile and all that stuff". Microsoft Help and Support.
  26. ^ Stone, Adrian. "The Hole That dlmalloc Can't Fill". Game Angst. Retrieved 2019-12-01.
  27. ^ Evans, Jason (2006-04-16). "A Scalable Concurrent malloc(3) Implementation for FreeBSD" (PDF). Retrieved 2012-03-18.
  28. ^ "libc/stdlib/malloc.c". BSD Cross Reference, OpenBSD src/lib/.
  29. ^ Berger, E. D.; McKinley, K. S.; Blumofe, R. D.; Wilson, P. R. (November 2000). Hoard: A Scalable Memory Allocator for Multithreaded Applications (PDF). ASPLOS-IX. Proceedings of the ninth international conference on Architectural support for programming languages and operating systems. pp. 117–128. CiteSeerX 10.1.1.1.4174. doi:10.1145/378993.379232. ISBN 1-58113-317-0.
  30. ^ Microsoft는 최적화된 malloc()를 오픈 소스로 출시 - Slashdot
  31. ^ TCMalloc 홈페이지
  32. ^ Ghemawat, Sanjay; Menage, Paul; TCMalloc : 스레드 캐시 말록
  33. ^ Callaghan, Mark (2009-01-18). "High Availability MySQL: Double sysbench throughput with TCMalloc". Mysqlha.blogspot.com. Retrieved 2011-09-18.
  34. ^ "kmalloc()/kfree() include/linux/slab.h". People.netfilter.org. Retrieved 2011-09-18.
  35. ^ Levine, John R. (2000) [October 1999]. "Chapter 9: Shared libraries". Linkers and Loaders. The Morgan Kaufmann Series in Software Engineering and Programming (1 ed.). San Francisco, USA: Morgan Kaufmann. ISBN 1-55860-496-0. OCLC 42413382. Archived from the original on 2012-12-05. Retrieved 2020-01-12. 코드: [1][2] 에라타: [3]
  36. ^ "malloc: make malloc fail with requests larger than PTRDIFF_MAX". Sourceware Bugzilla. 2019-04-18. Retrieved 2020-07-30.
  37. ^ "Why is the use of alloca() not considered good practice?". stackoverflow.com. Retrieved 2016-01-05.
  38. ^ Amarasinghe, Saman; Leiserson, Charles (2010). "6.172 Performance Engineering of Software Systems, Lecture 10". MIT OpenCourseWare. Massachusetts Institute of Technology. Archived from the original on 2015-06-22. Retrieved 2015-01-27.
  39. ^ "alloca(3) - Linux manual page". man7.org. Retrieved 2016-01-05.
  40. ^ posix_memalign – System Interfaces Reference, 단일 UNIX 사양, The Open Group 버전 4

외부 링크