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) 안썻으면 안쓰면된다.
'책 정리 > Effective C++ 3rd' 카테고리의 다른 글
항목 18. 인터페이스 설계는 제대로 쓰기엔 쉽게, 엉터리로 쓰기엔 어렵게 하자 (0) | 2020.01.07 |
---|---|
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자 (0) | 2020.01.02 |
항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근하도록 하자. (0) | 2019.12.30 |
항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자 (0) | 2019.12.30 |
항목 13. 자원 관리에는 객체가 그만! (0) | 2019.12.19 |
댓글