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