ㄱ. new로 생성한 것은 객체에 대해서는 유효 범위를 벗어 나면 스스로 지워 지는 것이 아니라, 직접 delete를 해 주어야 한다.
- for문을 사용 하여 delete 해 줄 시
① for_each 만큼 명확하지 않다.
② 예외 안전성이 갖추고 있지 않다.
- 포인터 컨테이너 대신에 스마트 포인터의 컨테이너를 사용하는 것.
- 스마트 포인터 사용시 auto_ptr은 피해야 함.
- boost라이브러리에 있는 shared_ptr을 사용.
class Widget { }; typedef std::vector< Widget* > VecWidget; /// for문을 사용한 해제. void doSomething() { VecWidget widget; for( VecWidget::iterator it = widget.begin(); it != widget.end(); ++it) { delete (*it); } } /// for_each문을 사용한 해제 - 1. template<typename t=""> struct DeleteObject : public unary_function<const t*,="" void=""> { void operator() (const T* ptr) const { delete ptr; } }; void doSomething() { VecWidget widget; /// Widget의 포인터를 삭제 하는 것이 당연하지만, 실수로 Widget 외의 /// 것을 할 경우 버그를 발생할 우려가 있음. for_each(widget.begin(), widget.end(), DeleteObject<widget>()) } /// for_each문을 사용한 해제 - 2. struct DeleteObject { template<typename t=""> void operator() (const T* ptr) const { delete ptr; } }; void doSomething() { VecWidget widget; /// Widget의 포인터를 삭제 하는 것이 당연하지만, 실수로 Widget 외의 /// 것을 할 경우 버그를 발생할 우려가 있음. for_each(widget.begin(), widget.end(), DeleteObject()) } </typename></widget></const></typename>
'[ Programming ] > [ Effective STL]' 카테고리의 다른 글
STL 항목 5 : 단일 요소를 단위로 동작하는 멤버 함수보다 요소의 범위를 단위로 동작하는 멤버 함수가 더 낫다. (0) | 2009.10.27 |
---|---|
STL 항목 4 : size()의 결과를 0과 비교할 생각이라면 차라리 empty를 호출하자. (0) | 2009.10.27 |
STL 항목 3 : 복사는 컨테이너 안의 객체에 맞게 비용은 최소화하며, 동작은 정확하게 하자. (1) | 2009.10.23 |
STL 항목 2 : “컨테이너에 독립적인 코드” 라는 환상을 조심하자. (0) | 2009.10.23 |
STL 항목 1 : 적재적소에 알맞은 컨테이너를 사용하자. (0) | 2009.10.22 |