03장. 자원 관리
항목 13. 자원 관리에는 객체가 그만!
펼쳐두기..
void F()
{
Investment* investment = createInvestment();
....
delete investment;
}
- '...' 중간에 return, goto, 예외로 인해 메모리 누수, 객체가 가지고 있는 자원 누수가 날수 있다.
- 스마트 포인터 auto_ptr, tr1::shared_ptr 등이 있다.
- 자원을 회득한 후에 자원 관리 객체에게 넘긴다.
- 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 합니다.
- 동적 배열은 사용하지 마라. (내부적으로 delete를 사용, 배열을 사용할 경우는 boost::shared_array 를 사용하거나, 삭제자(소멸함수를 명시적으로 넘겨줌)를 만들어 사용하자)
- 자원 누출을 막기위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII( Resource Acquisition Is Initializetion ) 객체를 사용합시다.
항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자.
펼쳐두기..
- 복사를 금지한다.
- 관리하고 있는 자원에 대해 참조 카운팅을 수행한다. ( tr1::shared_ptr )
- 관리하고 있는 자원을 진짜로 복사합니다. ( std::string )
- 관리하고 있는 자원의 소유권을 옮깁니다. ( auto_ptr )
- RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정됩니다.
- RAII 클래스에 구현하는 일반적인 복사 동작은 금지하거나 참조 카운팅을 해주는 선으로 마무리합니다.
항목 15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자.
펼쳐두기..
- 실제 자원을 직접 접근해야 하는 기존 API들도 많기 때문에, RAII 클래스를 만들 때는 그 클래스가 관리하는 자원을 얻을 수 있는 방법을 주어야 합니다.
- 자원 접근은 명시적 변환 혹은 암시적 변환을 통해 가능합니다. 안전성만 따지면 명시적 변환이 대체적으로 더 낫지만, 고객 편의성을 놓고 보면 암시적 변환이 괜찮습니다.
항목 16. new 및 delete를 사용할 때는 형태를 반드시 맞추자.
펼쳐두기..
- new 표현식에 []를 썼으면, 대응되는 delete 표현식에도 []를 써야 합니다.
- 이왕이면, std::string, std::vector 등을 사용하자.
항목 17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자.
- new 로 생성한 객체를 스마트 포인터로 넣는 코드는 별도의 한 문장으로 만듭시다. 이것이 안 되어 있으면, 예외가 발생될 때 디버깅하기 힘든 자원 누출이 초래될 수 있습니다.
이 글은 스프링노트에서 작성되었습니다.
댓글 없음:
댓글 쓰기