티스토리 뷰
3. 자원 관리
항목 13 : 자원 관리에는 객체가 그만!
- 자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII 객체를 사용합시다.
- 일반적으로 널리 쓰이는 RAII 클래스는 tr1::shared_ptr 그리고 auto_ptr입니다. 이 둘 가운데 tr1::shared_ptr이 복사 시의 동작이 직관적인기 때문에 대개 더 좋습니다. 반면, auto_ptr은 복사되는 객체(원본 객체)를 null로 만들어 버립니다.
- 참고 : [TR1] shared_ptr
항목 14 : 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자
- RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정됩니다.
- RAII 클래스에 구현하는 일반적인 복사 동작은 복사를 금지하거나 참조 카운팅을 해 주는 선으로 마무리하는 것입니다. 하지만 이 외의 방법들도 가능하니 참고해 둡시다.
항목 15 : 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자
- 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 열어 주어야 합니다.
- 자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능합니다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮습니다.
항목 16 : new 및 delete를 사용할 때는 형태를 반드시 맞추자
- new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 합니다. 마찬가지로 new 표현식에 []를 안 썼으면, 대응되는 delete 표현식에도 []를 쓰지 말아야 합니다.
항목 17 : new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자
- new로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만듭시다. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있습니다.
예)
// 처리 우선순위를 알려 주는 함수
int priority();
// 동적으로 할당한 Widget 객체에 대해 어떤 우선순위에 따라 처리를 적용하는 함수
void processWidget(std::tr1::shared_ptr<Widget> pw, int priority);
잘못된 예
// 인자 평가 순서에 따라 예외 발생 시 자원이 누출될 수 있습니다.
processWidget(std::tr1::shared_ptr<Widget>(new Widget), priority());
올바른 예
// new로 생성한 객체를 스마트 포인터에 담는 코드를
// 하나의 독립적인 문장으로 만듭니다.
std::tr1::shared_ptr<Widget> pw(new Widget);
// 이제 자원 누출 걱정이 없습니다.
processWidget(pw, priority());
- James Song
'Books_tech' 카테고리의 다른 글
다시 읽는 <Effective C++> Chapter 5 요약 (1) (1) | 2015.11.09 |
---|---|
다시 읽는 <Effective C++> Chapter 4 요약 (0) | 2015.11.06 |
다시 읽는 <Effective C++> Chapter 2 요약 (0) | 2015.11.02 |
다시 읽는 <Effective C++> Chapter 1 요약 (0) | 2015.11.02 |
<Effective Modern C++> Item 2 요약 (0) | 2015.09.04 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
TAG
- #임백준
- 상속
- #cplusplus
- #build2016
- #알고리즘
- #스콧마이어스
- #EffectiveModernCpp
- #팀개발
- #세미나
- #제럴드와인버그
- #cpp
- #로버트마틴
- #mva
- #uwp
- #프로그래밍심리학
- #클린코드
- #마이클페더스
- #ndc
- Effective Modern C++
- #코드최적화
- Scott Meyers
- Effective C++
- #레거시코드
- #ModernCPP
- 객체 지향 설계
- #techdays2015
- #scottmeyers
- #csharp
- 책
- #자녀교육
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함