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 중국어 웹사이트의 기타 관련 기사를 참조하세요!