일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- lua
- 메타테이블
- 티스토리챌린지
- Effective c++
- implicit conversion
- 참조자
- 비교 함수 객체
- UE4
- 루아
- 영화 리뷰
- 반복자
- c++
- effective stl
- 상속
- exception
- more effective c++
- 스마트 포인터
- 다형성
- reference
- 게임
- 영화
- 예외
- 언리얼
- Smart Pointer
- 암시적 변환
- virtual function
- 오블완
- 함수 객체
- resource management class
- operator new
Archives
- Today
- Total
스토리텔링 개발자
[Effective STL] 8. auto_ptr 금지 본문
728x90
항목 8. auto_ptr의 컨테이너는 절대로 만들지 말자
COAP(Container Of Auto Ptr) 금지
- 사실 컴파일러가 통과도 시켜주지 않아야 정상이다.
- 게다가 요새는 auto_ptr조차 표준이 아니다.
- 하지만 이 책이 쓰여질 시기에는 이를 허용하는 컴파일러가 있었고, 그것이 문제였다.
COAP 금지 이유
- 이식이 불가능하다.
- 표준은 auto_ptr을 컨테이너에 담지 못한다, 이기 때문이다.
- auto_ptr의 복사 동작이 문제된다.
auto_ptr의 복사 동작
- 복사하면, 소유권이 옮겨지고, 기존의 것은 null로 셋팅된다.
- 즉, auto_ptr을 복사하는 것은 '그 포인터의 값을 바꾸는 것이다'라고 할 수 있다.
auto_ptr<Widget> pw1(new Widget); // pw1 = 위젯의 포인터
auto_ptr<Widget> pw2(pw1); // pw1 = null, pw2 = 위젯의 포인터
pw1 = pw2; // pw1 = 위젯의 포인터, pw2 = null
- 이 동작이 치명적일 때가 있다. 아래는 벡터의 예제.
bool widgetAPCompare(const auto_ptr<Widget>& lhs,
const auto_ptr<Widget>& rhs)
{
return *lhs < *rhs;
}
vector< auto_ptr<Widget> > widgets;
...
sort(widgets.begin(), widgets.end(), widgetAPCompare); // 정렬 동작을 하면?
- 정렬은 보통 퀵소트(quicksort) 알고리즘을 사용한다.
- 컨테이너 내의 특정 요소를 "피벗 요소(pivot element)"로 선택한 후
- 이 요소보다 큰 값과 작은 값의 집합을 구분하고
- 두 집합에 대해 재귀 호출을 수행하여 정렬을 수행한다.
template<typename RandomAccessIterator, class Compare>
void sort(RndomAccessIterator first, RandomAccessIterator last, Compare comp)
{
// RandomAccessIterator가 가리키는 객체의 타입
// 위 벡터의 경우에는 auto_ptr<Widget> 이 될 것이다.
typedef typename iterator_traits<RandomAccessIterator>::value_type ElementType;
RandomAccessIterator i;
...
ElementType pivotValue(*i); // 복사가 발생한다!!
...
}
- 임시 변수로 복사되며 기존의 요소가 invalid 처리 된다는 의미이다.
728x90
'개발 > Effective STL' 카테고리의 다른 글
[Effective STL] 10. 할당자(Allocator)의 제약 사항 (1) | 2024.11.14 |
---|---|
[Effective STL] 9. 컨테이너별 요소 삭제 (0) | 2024.11.13 |
[Effective STL] 7. 컨테이너 요소 new, delete 짝 맞춤 문제 (0) | 2024.11.11 |
[Effective STL] 6. 컴파일러의 분석 오류 (0) | 2024.11.08 |
[Effective STL] 5. 범위 멤버 함수(Range Member Function) (0) | 2024.11.07 |
Comments