상세 컨텐츠

본문 제목

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

C++/Effective C++

by DeaKyungLee 2021. 12. 5. 17:50

본문

new, delete 의 형태

std::string *stringArray = new std::string[100];
 
 
...
 
 
delete stringArray;

위의 예시에서 잘 못된 점이 무엇일까?

new 형식은 [] 배열 형식인데, 여기에 대응되는 delete는 배열 형식이 아니라는 점이다.

흔히들 말하는 new ↔ delete , new[] ↔ delete[] 형태의 짝을 맞추라는 말이다.

그런데 정확하게 어떤 동작들이 일어나길래 짝이 맞지 않으면 문제가 되는 걸까?

Heap 에 선언된 객체의 메모리 구조를 간략하게 설명하자면 아래와 같다.

단일 객체 : [Object]

배열 객체 : [size] [Object] [Object] [Object] [Object] ...

즉, Heap에서 배열 객체가 선언될 때, 가장 앞 부분에 해당 객체의 size가 먼저 명시된다는 말이다.

때문에 짝에 맞지 않는 delete를 호출하면 프로그램은 미정의 동작을 하게 된다.

typedef 유의점

typedef std::string strArr[4];
std::string *pal1 = new strArr; // new strArr 은 new string[4]이다..
…
delete[] pal; //정상

typedef 를 배열 형식으로 적용시키면 사용하는 입장에서 해당 객체를 delete 할 때 어떤 형태로 해야 할지 확인이 힘들다.

 

Things to Remember

  • new 표현식에 [] 을 썼다면 대응되는 delete 표현식 역시 [] 형태로 맞춰야 한다.
  • 반대로 [] 표현식을 쓰지 않았다면 delete에도 쓰면 안 된다.

관련글 더보기

댓글 영역