[Effective C++] #16 new 및 delete 사용
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 3장 "자원 관리", 항목 16 "new 및 delete를 사용할 때는 형태를 반드시 맞추자"에 해당하는 내용입니다.
동적 할당
코드 작성 중 일시적으로 필요한 만큼의 자원을 할당받고 불필요한 자원 낭비를 방지하는 메모리 할당 방법입니다. 우리가 작성한 program이 정상적으로 실행되기 위해 메모리 공간이 필요합니다. 이때, 프로세스의 runtime 중 필요한 메모리 크기만큼을 컴퓨터에 일려 줌으로써 자원을 보다 효율적으로 사용할 수 있도록 해줍니다. 동적 할당은 heap 영역에서 이루어지고, new를 통해 할당받고, delete를 통해 자원을 해제할 수 있습니다. heap의 경우 동적 메모리 할당을 담당하며, 사용자가 직접 관리해야 하는 만큼, 자원의 할당과 해제에 있어서 신경 써야 할 부분이 존재합니다.
동적 할당 예제
int* number = new int; // 동적 메모리 할당
delete number; //자원 해제
위 예제를 살펴보겠습니다. "타입명* 변수명 = new 타입명"을 통해 메모리 동적 할당이 가능합니다. 이때, 우리가 일반적으로 정수형 변수를 정의하는 방식과 차이점이 존재합니다. 동적 할당은 정수형의 크기만큼의 메모리를 요청하고, 해당 메모리를 사용하여 객체를 생성하고, 해당 객체의 메모리 주소값을 반환합니다. 따라서, 포인터를 사용합니다. 할당받은 메모리를 다시 반환하기 위해 delete 키워드를 사용합니다.
new와 delete의 형태 맞추기
std::string* stringArray = new std::string[100];
...
delete stringArray;
위 코드를 살펴보겠습니다. stringArray는 100개의 string 객체를 갖는 배열을 가리킵니다. new를 통해 메모리를 동적으로 할당받고, 최소 1개 이상의 생성자가 호출됩니다. delete의 경우, 기존에 할당된 메모리에 대해 소멸자가 호출되고, 해당 메모리가 해제됩니다. 이때, 주의할 점은 소멸자 호출의 횟수입니다. 배열을 위해 할당받은 메모리를 해제하기 위해 우리는 "delete"가 아니라, "delete[]"를 사용해야 합니다!
힙의 메모리 배치 구조
단일 객체의 메모리 배치 구조와 배열 객체에대한 메모리 배치 구조는 차이점이 존재합니다. 배열 객체의 경우 힙 메모리에 배열 원소의 개수에 대한 정보가 존재합니다. 따라서, "delete" 연산은 소멸자 호출의 횟수를 쉽게 알 수 있습니다. 반면, 단일 객체용 힙 메모리에는 이러한 정보가 존재하지 않습니다. 그러므로, 우리는 배열 객체에 대한 delete 호출에 있어서, 배열 크기에 대한 정보를 "delete" 연산에게 알려줄 필요가 있습니다. 쉽게 얘기해서, delete에게 해제하고자 하는 포인터가 "단일 객체"를 가리키는지, "배열"을 가리키는지에 대한 정보를 알려주는 겁니다.
delete [] 사용 예제
std::string Address[4];
std::string* ptr = new Address; //배열을 가리키는 포인터, ptr
delete[] ptr;
포인터 멤버의 초기화를 담당하는 생성자는 new의 형태를 똑같이 맞출 수밖에 없습니다. 이를 통해, 소멸자에서 어떤 형태의 delete를 사용해야 할지 알 수 있겠죠. 간단하게 얘기해서, new 표현식에 []를 사용했다면, 여기에 대응되는 delete 표현식에도 []를 써야 합니다.
new 표현식의 형태와 delete 표현식의 형태는 짝을 이뤄야 합니다.
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #18 인터페이스 설계 (0) | 2022.01.18 |
---|---|
[Effective C++] #17 자원 관리 객체와 new 사용 (0) | 2022.01.17 |
[Effective C++] #15 자원 관리 객체, 자원에 대한 접근 (0) | 2022.01.15 |
[Effective C++] #14 자원 관리 객체 심화, RAII, shared_ptr, 삭제자 지정 (0) | 2022.01.14 |
[Effective C++] #13 자원 관리 객체, std::auto_ptr, std::shared_ptr (0) | 2022.01.14 |