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 std::string strArr[4];
std::string *pal1 = new strArr; // new strArr 은 new string[4]이다..
…
delete[] pal; //정상
typedef 를 배열 형식으로 적용시키면 사용하는 입장에서 해당 객체를 delete 할 때 어떤 형태로 해야 할지 확인이 힘들다.
항목 18) 좋은 인터페이스 설계: 제대로 쓰기에는 쉽게, 엉터리로 쓰기에는 어렵게 (0) | 2021.12.05 |
---|---|
항목 17) new 생성 객체를 스마트 포인터로 저장하는 코드에 대한 별도 관리 (0) | 2021.12.05 |
항목 15) 자원 관리 클래스에서 관리되는 자원은 외부 접근을 차단하자 (0) | 2021.12.05 |
항목 14) 자원 관리 클래스의 복사 동작에 대해서 (0) | 2021.12.05 |
항목 13) 객체를 활용한 자원 관리 ( RAII 패턴 ) (0) | 2021.12.05 |
댓글 영역