책 정리/Effective C++ 3rd
항목 16. new 및 delete 를 사용할 때는 형태를 반드시 맞추자
ocean20
2020. 1. 2. 14:50
std::string* strArr = new std::string[100];
…
delete strArr //ERROR
위코드를 보면 100개의 string 객체중 99개는 정상적인 소멸과정을 못거칠 것이다.
객체 배열 해제시에는 []delete를 해줘야하는 이유는?
그전에 new, delete의 동작을 확인해보자.
new연산자를 사용하면 2가지 동작을 수행한다.
1. 메모리 할당
2. 할당된 메모리에 대해 한 개 이상의 생성자 호출
delete연산자는?
1. 할당된 메모리에 대해 한 개이상의 소멸자 호출
2. 메모리 해제
요것도 확인해보자.
단일 객체와 배열객체의 메모리 배치구조 in Heap
단일 객체 case
[object]
배열객체
[ 3 ][object][object][object]
대다수의 컴파일러는 맨 앞 숫자 (ex. 3)을 보고 배열객체라고 해석하며 해당숫자만큼의 소멸자를 호출한다.
자, 이제 배열 해제시 []delete를 해줘야하는 이유를 확인하였다.
배열객체임을 확인하고, 해당 개수만큼 소멸자를 호출하기 위해!
유의점.
typedef로 배열타입을 정의하지말자.
typedef std::string strArr[4];
std::string *pal1 = new strArr; // new strArr 은 new string[4]이다..
…
delete[] pal; //정상
typedef 로 배열을 정의하면. 가시적으로 확인하기가 힘들기에 typedef로 배열정의 하지말자.
이것만은 잊지 말자!
(1) new표현식에 []를 썻으면, delete에도 []를 쓰자
(2) 안썻으면 안쓰면된다.