2008. 8. 24. 23:17

new와 delete의 사용시 동일한 형식을 이용한다.

만일 new를 호출할 때 []를 이용했다면 delete의 호출시에도 []을 이용한다. 만일 new의 호출시 []을 이용하지 않았다면 delete의 호출시 []을 이용하지 않는다.

이 법칙은 typedef 계통을 위해서도 중요하다. typedef의 저자는 new가 typedef 타입의 객체들을 불러내기 위해 이용될 때, 어떠한 형태의 delete가 사용되어야 하는지를 문서화해야 한다. 예를 들어, 다음과 같은 typedef 을 생각해보자.

typedef string AddressLines[4]; // 개인 주소는 4개의 줄을 차지하고 그들의 각각은 스트링임

AddressLines는 배열이기 때문에 다음과 같은 new의 사용은,

string * pal = new AddressLines;

// "new AddressLines"가 "new string[4]"와 마찬가지로
// string * 을 반환함을 주목

배열 형태의 delete와 일치해야만 한다.

delete pal; // 예측 불능

delete [] pal; // 양호

이와 같은 혼란을 피가히 위해선 배열 타입들에 대한 typedef를 피하는 것이 최선일 것이다.

하지만, 표준 C++ 라이브러리는 내부 배열의 필요성을 거의 느끼지 못하게 할 정도의 string과 vector 템플릿들을 포함하고 있기 때문에 이와 같은 것은 쉽게 해결될 수 있다. 예를 들어, 여기서 AddressLines는 string의 vector로 정의될 수 있다. 즉, AddressLines는 vector<string> 타입이 될 수 있다.

출처 : Effective C++, Scott Meyers 저