KoreanFoodie's Study

Effective C++ | 항목 16 : new 및 delete 를 사용할 때는 형태를 반드시 맞추자 본문

Tutorials/C++ : Advanced

Effective C++ | 항목 16 : new 및 delete 를 사용할 때는 형태를 반드시 맞추자

GoldGiver 2022. 10. 25. 16:10

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!

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

핵심 :

new 표현식에 [ ] 를 썼으면, 대응되는 delete 표현식에도 [ ] 를 써야 한다. 마찬가지로, new 표현식에 [ ] 를 안 썼으면, 대응되는 delete 표현식에도 [ ] 를 쓰지 말아야 한다.

 

아래 코드는 어떤 부분이 잘못되었을까?

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

stringArray 는 배열이므로, delete[] 를 사용하지 않으면 배열의 객체 메모리 해제가 재대로 되지 않아 미정의 동작을 보이게 된다! [ ] 를 붙여주지 않으면, 컴파일러는 메모리를 해제하려는 객체가 단일 객체라고 가정하기 때문이다!

반대로, 배열이 아닌 객체에 소멸자에 delete[] 를 사용하면, 앞쪽의 메모리 몇 바이트를 읽고 이것을 배열 크기라고 해석할 것이다. 그리고 배열 크기에 해당하는 횟수만큼 소멸자를 호출한다.

위의 원칙은 typedef 을 쓸 때도 잘 지켜져야 한다. 예시를 보자.

typedef std::string AddressLines[4];

// new string[4] 와 같다
std::string *pa1 = new AddressLines;

// 제대로 된 경우
delete [] pal;
// 아래 코드는 미정의 동작!
delete pal;

 

Comments