>  기사  >  백엔드 개발  >  C++ new() 및 malloc() 함수 학습

C++ new() 및 malloc() 함수 학습

little bottle
little bottle앞으로
2019-04-30 13:18:223668검색

C++에 익숙한 친구는 C++가 프로그래머에게 메모리 관리와 같은 하드웨어를 다룰 수 있는 가능성을 제공한다는 것을 알아야 합니다. 고급 C++ 프로그래머는 C++ 프로그램의 성능을 극한까지 최적화하고 하드웨어 리소스를 소모할 수 있습니다. 이제 메모리 관리와 관련된 new 및 malloc()에 대해 이야기하고 싶습니다.

 먼저 malloc()에 대해 이야기해 보겠습니다. Malloc은 C 언어에서 상속된 함수로, 반환 결과는 필요한 메모리에 대한 포인터입니다. 예는 다음과 같습니다:

/*
  函数原型
  其中__size是你要分配的大小,其单位是byte
*/
void* malloc(size_t __size);

// 用例
int* pInt = (int*) malloc(sizeof(int));               // 分配了一个int
double* pDoubleArray = (double*) malloc(sizeof(double) * 5);   // 分配了一个double数组,其大小为5

일반적으로 malloc은 항상 메모리를 할당할 수 있습니다. 하지만 상황이 너무 부담스럽고 ​​기억력이 부족한 상황도 있다. 이때, malloc은 널 포인터(NULL, nullptr)를 반환하게 됩니다. malloc을 사용할 때는 반환된 포인터가 null인지 매번 확인하는 것이 좋습니다.

관련 튜토리얼: C++ 비디오 튜토리얼

이제 메모리가 할당되었습니다. 프로그램이 특정 지점에 도달하면 더 이상 메모리를 원하지 않습니다. 이때 수동으로 메모리를 해제해야 합니다. 그렇지 않으면 메모리 누수가 발생합니다. free() 함수를 통해 메모리를 해제합니다. 함수 프로토타입과 사용 예는 다음과 같습니다.

// 原型
void free(void* __ptr);

// 用例
free(pInt);
free(pDoubleArray);

흥미로운 점은 free 함수에 전달하는 것은 단지 포인터일 뿐이라는 것입니다. 그러나 요소를 할당하든 배열을 할당하든 free입니다. can Always 이 메모리를 해제하는 데 도움을 줍니다. (free는 할당한 배열의 크기를 어떻게 알 수 있나요?)

메모리 할당 시 malloc이 수행하는 작업을 자세히 설명하겠습니다. malloc이 메모리를 할당할 때 필요한 메모리 크기를 할당할 뿐만 아니라 메모리의 헤드와 테일에 몇 가지 추가 정보(일반적으로 cookie로 알려짐)를 추가합니다. 예를 들어 DEBUG에 사용되는 정보 및 메모리 크기입니다. 이는 메모리가 얼마나 큰지 알기 때문에 메모리를 확보할 수 있는 이유를 설명합니다. 이 쿠키는 약간의 메모리를 차지한다는 점을 언급할 가치가 있습니다. . .

 자, malloc이 거의 도입되었습니다. 또 말씀드리고 싶은 점은 malloc은 운영체제의 커널 기능이 아닌 제3자 기능일 뿐이라는 것입니다. 추가적인 요구 사항이 있는 경우 자신만의 malloc을 디자인할 수 있습니다. 다음으로 새로운 것에 대해 이야기하겠습니다.

 New는 C++에서 제공하는 조작자(또는 키워드)입니다. 메모리 할당에도 사용됩니다. 사용 사례는 다음과 같습니다:

int* pInt = new int(3);            // 分配并构造一个int
double* pDoubleArray = new double[5];    // 分配了一个double数组,其大小是5

delete pInt;                   // 删除单元素
delete[] pDoubleArray;             // 删除数组

여전히 오래된 주제입니다. 일반적으로 말하면 프로그램이 메모리를 할당할 수 있지만, 한계에 도달하면 어떻게 해야 할까요? 이때 프로그램은 std::bad_alloc 예외를 발생시킵니다. 이는 new와 malloc의 차이점 중 하나입니다. 하지만 칭찬할만한 점은 C++에서 bad_alloc 예외를 처리하는 메커니즘을 제공한다는 점입니다. 그 방법은 다음과 같습니다.

void BadAllocateHandler()
{
  std::cout << "啊,内存分配失败了" << std::endl;
  exit(0);
}

std::set_new_handler(BadAllocateHandler);

 BadAllocateHandler는 할당이 실패할 때 프로그래머가 직접 작성한 처리 함수입니다. 그리고 set_new_handler는 C++에서 제공하는 메커니즘입니다. 일반적으로 칩이 떨어졌을 때 해야 할 일은 두 가지뿐입니다. 프로그램이 종료되도록 놔두거나 할당을 계속하기 위해 다른 곳에서 일부 메모리를 파낼 방법을 찾으십시오.

new가 키워드라는 것은 이미 알고 계실 겁니다. 프로그램의 경우 모든 작업은 함수 호출로 돌아갑니다. 그렇다면 새로 태어났을 때 정확히 무슨 일이 일어났나요? 새로 만들 때 프로그램은 먼저 ::operator new() 함수를 호출합니다. 그러면 ::operator new()의 프로그램이 malloc()을 호출합니다. 아! 모든 것이 명확해졌습니다. new의 핵심은 malloc 함수를 호출하는 것입니다! ! 마찬가지로 삭제의 핵심은 free() 함수를 호출하는 것입니다.

new의 본질은 malloc을 호출하는 것이지만 new와 malloc에는 큰 차이점이 하나 있습니다. 즉, 메모리에서 new가 나온 후 new는 객체를 구성하는 데 도움이 되는 반면, malloc은 메모리만 할당합니다. 구체적인 예는 다음과 같습니다.

class MyObj {
public:
  public MyObj(int value) : val(value) {}
  int val;
};

MyObj* obj = new MyObj(4);
MyObj* obj1 = (MyObj*) malloc(sizeof(MyObj));

 new의 방법은 malloc이 메모리를 할당한 후 컴파일러가 클래스의 생성자를 직접 호출하여 이 메모리에 객체를 생성하는 것입니다. 알아채다! 컴파일러만이 클래스 생성자를 직접 호출할 수 있습니다. malloc을 사용하면 직접 객체를 생성할 수 없습니다.

위 내용은 C++ new() 및 malloc() 함수 학습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 cnblogs.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제