본문 바로가기
책 정리/Effective C++ 3rd

항목 16. new 및 delete 를 사용할 때는 형태를 반드시 맞추자

by ocean20 2020. 1. 2.
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) 안썻으면 안쓰면된다.

댓글