C ++ 동적 할당 (new와 malloc의 사용법 및 차이점)

참조 : https://blog.csdn.net/zhong29/article/details/80930919
https://blog.csdn.net/nyist_zxp/article/details/80810742

1. malloc 및 free
1. 함수 선언 :
void *malloc(int size);
설명 : malloc은 메모리 공간의 크기 바이트를 할당하기 위해 시스템에 적용되며 반환 유형은 void *입니다.

2. 사용

int* p;
p = (int*)malloc(sizeof(int));

free(p);//释放内存

Malloc 함수 사용 참고 :
1) Malloc은 불확정 유형 포인터를 리턴하므로 리턴하기 전에 강제 유형 변환을 수행해야합니다. 그렇지 않으면 컴파일 오류가 발생합니다.

2) Malloc은 메모리 만 할당하고 초기화는하지 않으며 메모리 공간의 값은 랜덤 일 수 있습니다. 할당 된 공간이 이전에 사용되지 않은 경우 각 값은 0이 될 수 있습니다. 반대로 공간에는 다양한 가치가 남을 수 있습니다.

3) 실제 매개 변수는 할당해야하는 바이트의 크기입니다. malloc (1)이면 시스템은 1 바이트의 메모리 공간 만 할당합니다. 이때 int 값이이 공간에 저장되면 int 유형으로 인해 4 바이트를 차지하고 3 바이트의 할당되지 않은 공간이 있으며 시스템은 할당 된 1 바이트를 기준으로 3 바이트의 공간을 차례로 뒤로 할당합니다. "others"의 값은 "."의 3 바이트 공간에서 지워집니다.

4) 할당 된 공간이 더 이상 사용되지 않으면 free 기능을 사용하여이 메모리 공간을 해제하십시오.

5) 포인터가 가리키는 메모리 공간은 포인터 자체 대신 해제됩니다. 포인터는 해제 후에도 여전히 존재합니다 (예를 들어, 포인터와 같은 변수는 프로그램 끝에서만 소멸됩니다).

int* p;
p = (int*)malloc(sizeof(int));

free(p);

int a = 10;
p = &a;//指针依旧存在且可以被赋值

3. malloc 함수의 작동 메커니즘
1) malloc 함수가 호출되면 malloc 함수 는 사용 가능한 연결 목록 (메모리 힙에 존재)을 따라 수요를 충족하는 메모리 블록을 찾아 다음의 메모리 블록을 할당합니다. 사용자에게 필요한 크기, 나머지는 연결된 목록으로 돌아갑니다.

2) free 함수 호출시 사용자가 해제 한 메모리 블록을 free chain에 연결합니다.

3) malloc 함수를 여러 번 호출하거나 호출 한 후 free linked list는 여러 개의 작은 메모리 조각으로 분할됩니다. 사용자가 더 큰 메모리 공간을 신청할 때 free에 대한 요구를 충족하는 메모리 블록이 없을 수 있습니다. 이때 malloc 함수는 지연을 요청하고 free linked list의 작은 메모리 조각을 큰 메모리 블록으로 구성한 후 마지막으로 반환합니다.

4) 요구 사항에 맞는 메모리 블록을 얻을 수없는 경우 malloc 함수는 NULL 포인터를 반환하므로 malloc을 호출하여 동적으로 메모리 블록을 적용 할 때 반환 값을 판단해야합니다.

Two, new 및 delete
1, new
1) 형식 :
new 类型名T(初始化参数列表)

2) 기능 :
프로그램 실행 중 T 형 객체 저장을위한 메모리 공간을 신청하고 초기 값 목록에 따라 초기 값을 할당합니다.

3) 결과 :
Achievement- "T- 타입 포인터는 새로 할당 된 메모리를 가리 킵니다.
실패-"예외를 던집니다.

예 :

//开辟单地址空间
int *p = new int;  //开辟大小为sizeof(int)空间
int *q = new int(5); //开辟大小为sizeof(int)的空间,并初始化为5。
//开辟数组空间
//一维
int *a = new int[100]{
    
    0};//开辟大小为100的整型数组空间,并初始化为0。
//二维
int (*a)[6] = new int[5][6];
//三维
int (*a)[5][6] = new int[3][5][6];
//四维及以上以此类推。

2. 삭제
1) 형식 :
delete 指针p

2) 기능 :
포인터가 가리키는 메모리
p 해제 하려면 p는 새 연산의 반환 값이어야합니다.

3) 예 :

//释放单个int空间
int *a = new int;
delete a;
//释放int数组空间
int *b = new int[5];
delete []b;

3. 둘의 차이점
1.
new 및 delete 속성 은 C ++ 키워드이며 컴파일러에서 지원해야하며 malloc 및 free는 라이브러리 함수이며 헤더 파일 지원이 필요합니다.

2. 매개 변수
new 연산자를 사용하여 메모리 할당을 신청할 때 메모리 블록의 크기를 지정할 필요가 없으며 컴파일러는 유형 정보에 따라이를 계산합니다. 그리고 malloc은 필요한 메모리의 크기를 명시 적으로 표시해야합니다.

3. 반환형
new 연산자 메모리 할당이 성공하면 객체 형의 포인터를 반환하며, 해당 유형은 객체와 엄격하게 일치하며 유형 변환이 필요하지 않으므로 new는 유형 안전성을 준수하는 연산자입니다. malloc 메모리 할당이 성공하는 동안 void *를 반환하고 void * 포인터를 강제 유형 변환을 통해 필요한 유형으로 변환해야합니다.

4. 사용자 정의 유형
new는 먼저 operator new 함수를 호출하여 충분한 메모리를 적용합니다 (일반적으로 맨 아래 계층은 malloc을 사용하여 구현 됨). 그런 다음 형식의 생성자를 호출하고 멤버 변수를 초기화 한 다음 마지막으로 사용자 지정 형식에 대한 포인터를 반환합니다. delete는 먼저 소멸자를 호출 한 다음 연산자 삭제 함수를 호출하여 메모리를 해제합니다 (일반적으로 맨 아래 계층은 free를 사용하여 구현 됨).

malloc / free는 동적으로 메모리를 적용하고 해제 할 수만 있고 사용자 지정 유형 개체 생성 및 소멸을 강제 할 수없는 라이브러리 함수입니다.

5.
C ++ 오버로딩을 통해 사용자 정의 operator new 및 operator delete 함수를 사용하여 동적 메모리 할당을 제어 할 수 있습니다.

6, 메모리 영역
new는 두 가지 작업을 수행합니다. 메모리를 할당하고 클래스의 생성자를 호출하고, 삭제는 클래스의 소멸자를 호출하고 메모리를 해제하는 것입니다. 그리고 malloc과 free는 메모리를 할당하고 해제합니다.

new 연산자는 free store에서 개체에 대한 메모리 공간을 동적으로 할당하는 반면 malloc 함수는 힙에서 메모리를 동적으로 할당합니다. free storage area는 new operator를 기반으로 한 C ++의 추상적 인 개념으로 new operator를 통한 모든 메모리 응용 프로그램이 free storage area가 됩니다. 힙은 운영 체제의 용어로, 프로그램 메모리의 동적 할당을 위해 운영 체제에서 유지 관리하는 특수 메모리입니다. C 언어는 malloc을 사용하여 힙에서 메모리를 할당하고 할당 된 해당 메모리를 해제 할 수 있습니다. 여유 저장 영역은 힙과 같지 않습니다. 위에서 언급했듯이 new 레이아웃은 힙에 위치 할 필요가 없습니다.

7. 할당 실패
새 메모리 할당이 실패하면 bac_alloc 예외가 발생합니다 (try-catch가 필요함). Malloc은 메모리 할당에 실패하면 NULL을 반환합니다.

8. 메모리 누수
메모리 누수는 new와 malloc 모두에 대해 감지 할 수 있으며 new는 어떤 파일의 라인을 지정할 수 있지만 malloc은 그렇지 않습니다.

추천

출처blog.csdn.net/qq_43530773/article/details/113895903