3장 자원관리

보물창고·2021년 7월 26일
0

이펙티브 c++

목록 보기
2/6

항목 13: 자원 관리에는 객체가 그만!

  • 함수 내에서 자원할당 ~ ..코드 사이.. ~ 해제 가 진행 중에 그 사이에서 return, continue등 함수를 빠져 나오는 작업이 발생할 수도 있다.
    이러한 경우에 대비해서 생성자에서 자원을 할당하고, 소멸자에서 자원을 해제하도록 하자!

RAII

: Resource Acquisition is Initialization // 자원 획득 즉 초기화

  • 자원 획득과 자원 객체의 초기화가 한 문장에서 이루어진다.
    auto_ptr<클래스명>p_object(create());

스마트 포인터를 이용하자.

1. auto_ptr

  • auto_ptr은 자신이 소멸될때 가리키고 있는 대상에 대해 자동으로 delete를 먹인다.
  • 어떤 객체를 두개 이상의 auto_ptr이 가리킨다면 이미 해제된 객체를 또 해제하므로 문제가 생긴다.
  • 이러한 불상사를 막기 위해 auto_ptr은 복사생성이나 복사 대입 발생 시 원본 객체는 null로 만든다. 소유권을 이전하는 것이다.

    이러한 특징으로 인해 auto_ptr을 사용하는 것은 최선이 아니다.
    소유권을 잃는 특징을 모르고, 원본을 참조하면 null값을 참조하게 되므로 최선이 아니다.

2. shared_ptr

  • 참조카운팅 방식인 shared_ptr을 사용하자.
  • 외부 객체의 개수를 유지하다가 그 개수가 0이 되면 해당 자원을 자동으로 삭제한다.

    위에서 동일한 객체를 가리키는 두개의 shared_ptr이 잇다면 참조개수 2개에서 포인터들이 소멸되면서 갯수가 0이 되면 그때서야 가리키는 객체를 소멸시킨다는 소리이다.

  • 가비지 컬렉션과 유사

3. 알아야 할점

  • auto_ptr과 shared_ptr은 소멸자 내부에서 delete 연산자를 사용하지만,
    동적할당된 배열을 delete [] 하지는 못한다.

항목 14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자.

  • 동적으로 할당받은 객체를 복사하게 된다면 얕은복사 문제가 생긴다.

1. 복사를 금지한다.

1) private에다가 복사 생성자를 명시
2) 복사 방지 코드 작성

class Lock : private Uncopyable{

}

2. 관리하고 있는 자원에 참조 카운팅을 수행한다.

  • shared_ptr을 사용하자.
profile
🔥🔥🔥

0개의 댓글