[effective STL] 항목 07 : 포인터를 컨테이너 담을 때 주의
2015. 9. 6. 18:59ㆍ프로그래밍/Effective STL
728x90
728x90
이유
컨테이너는 소멸시에 객체의 메모리를 해제하지만 포인터의 소멸자가 아무 일도 하지 않는다.
포인터에 대해 delete를 하지 않기 때문!!
예제
1 2 3 4 5 6 7 8 9 10 11 | void doSomthing() { std::vector<Widget*> vwp; for (int i = 0; i < 10; i++) { vwp.push_back(new Widget); } // use vwp } // memory leak | cs |
해당 코드는 vwp에서 Widget에 대한 포인터를 담아서 관리한다.
이런 경우 delete는 프로그래머가 관리해줘야한다.
간단한 해결
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | void doSomthingDelete() { std::vector<Widget*> vwp; for (int i = 0; i < 10; i++) { vwp.push_back(new Widget); } // use vwp for (Widget* i : vwp) { delete i; } } | cs |
하지만 이 코드는 예외 안전성에 취약하다.
vwp에 포인터가 들어 있고 delete가 수행되기 직전에 예외가 발생하면 결국 누수...
해결하는 방법은 template을 이용한 방법이 있는데
이것들도 그닥 좋아보이진 않는다.. 그냥 마지막에 스마트 포인터 사용하는 것으로
스마트 포인터 사용해서 해결하기
1 2 3 4 5 6 7 8 9 10 11 12 | void doSomthingSharedPTR() { typedef std::shared_ptr<Widget> SPW; std::vector<SPW> vwp; for(SPW ptr : vwp) { vwp.push_back(SPW(new Widget)); } // use } | cs |
좋아 깔끔해!
728x90
반응형
'프로그래밍 > Effective STL' 카테고리의 다른 글
[effective STL] 항목 10 : 할당자(allocator)의 일반적인 사항과 제약 사항 (1) | 2015.09.14 |
---|---|
[effective STL] 항목 09 : 데이터를 삭제할 때에도 조심스럽게 선택 (0) | 2015.09.07 |
[effective STL] 항목 08 : auto_ptr의 컨테이너는 절대 말들지 말기 (0) | 2015.09.06 |
[effective STL] 항목 06 : C++ 컴파일러의 어이없는 컴파일 조심! (2) | 2015.09.05 |
맴버 함수는 단일 요소 단위 보단 요소의 범위 단위로 (effective STL 05) (0) | 2015.08.27 |
size() == 0? empty()!! (effective STL 04) (0) | 2015.08.25 |
복사는 컨테이너 안의 객체에 맞게 비용 최소화, 동작은 정확히(effective STL 03) (0) | 2015.08.25 |