![](https://velog.velcdn.com/images/minsu_lighting--/post/4de765f5-1d4f-459b-baea-284877333baf/image.png)
[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "
[핵심]
" new에 []
를 썼다면 delete에도 []
를, 그냥 new 라면 delete도 그냥.. "
- new와 delete 표현식은 동일해야 한다!
- 배열을 typedef 타입으로 만들지 말자!
💡 단일 객체, 객체의 배열은 메모리 배치구조가 다르다!
![](https://velog.velcdn.com/images/minsu_lighting--/post/1da7984d-7bcf-468d-af78-e57b4d70bfad/image.png)
- 배열을 위해 만들어지는 힙 메모리에는 대개 배열 원소의 개수가 들어 감.
- delete 연산자는 소멸자가 몇번 호출될지 알기 쉬움
📌 단일 객체에 delete[ ] . . . ?
- delete 연산자는 객체의 메모리 앞 부분 몇 바이트를 읽고 그것이 배열의 개수라고 판단, 개수 만큼 소멸자를 부르게 된다.
- 객체의 메모리를 넘어가 문제가 발생!
📌 객체의 배열에 delete . . . ?
- 소멸자의 호출 회수가 적어 다 지우지 못함.
- 소멸자가 없는 기본 제공 타입(int 등)도 미정의 동작이 일어 남
📌 typedef 에서의 주의점!
typedef string AddressLines[4];
string *pal = new AddressLines;
delete pal; // 무슨 일이 생길지 모름...!
delete [] pal; // 정상 작동!
- 웬만하면 배열 타입을 typedef 타입으로는 만들지 말자!