[ Effective C++ ] 항목 13 : 자원 관리에는 객체가 그만!

Minsu._.Lighting·2023년 11월 21일
0

[ Effective C++ ] 정리 모음집
" C++ 프로그래머의 필독서, 스콧 마이어스의 Effective C++ 를 읽고 내용 요약 / 정리 "

[핵심]

" 자원 해제를 일일이 하다 보면 언젠가는 잘못을 저지를 수 있다... 안전한 자원관리 방법을 알아두자! "

  • 자원 누출을 막기 위해, 생성자 안에서 자원을 획득하고 소멸자에서 그것을 해제하는 RAII객체를 사용하자!
  • 일반 적으로 널리 쓰이는 RAII 클래스는 shared_ptr, auto_ptr이 있다, 두 스마트 포인터의 복사 방식 차이점을 명확히 알고 사용하자!

💡 자원 관리에 실패한다면...?

void Func(void)
{
	CPlayer* pPlayer = CObjectManager::createPlayer();
    ...
    ...
    ...
    delete pPlayer;
}
  • delete에 도달하기 전 return이 있다면...
  • delete가 루프안에 있고 break, continue, goto문에 의해 루프에서 빠져 나온다면...
  • delete에 도달하기 전 예외가 발생한다면...
  • 메모리가 누출되고 자원이 샌다!


💡 자원 관리를 확실히 하자!

  • 코드 블록 혹은 함수로부터 실행제어가 빠져 나올 때 자원을 해제하자!
    - 상당수의 자원이 힙에서 동적 할당 되고, 하나의 코드 블록 혹은 함수 안에서만 쓰이는 경우가 많다.

  • 자원 관리에 객체를 사용하는 방법

    • 자원을 획득한 후에 자원관리 객체에 넘긴다.
      - 자원 획득 즉 초기화(Resource Acquisition Is Initialize : RAII)
      - 획득된 자원으로 자원 관리 객체를 초기화 하지 않고 그 자원을 그 객체에 대입하는 경우도 종종 있지만 결은 같음

    • 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 한다.
      - 소멸자는 어떤 객체가 소멸될 때 자동 호출되기 때문에 실행제어가 어떤 경위로 떠나는지에 관계 없이 자원을 제대로 해제 시킴

📌 auto_ptr

  • 포인터와 비슷하게 동작하는 자원 관리용 객체(스마트 포인터)
    - 가리키고 있는 대상에 대해 소멸자가 자동으로 delete를 불러주도록 설계

  • 복사 시 원본 객체를 null로 만들어 복사된 객체만이 해당자원의 소유권을 갖음
    - auto_ptr은 소멸될 때 자신이 가리키는 대상을 자동으로 delete 시키기 때문에 같은 대상을 가리키지 않아야 함
    - STL 컨테이너의 경우 '정상적인' 복사 과정을 가져야 하기 때문에 auto_ptr은 STL 컨테이너의 원소로 사용할 수 없음

📌 shared_ptr

  • 참조 카운팅 방식 스마트 포인터(Reference - Counting Smart Pointer : RCSP)의 대표적인 객체
    - 자원을 가리키는 외부 객체의 개수를 유지하다가 개수가 0이되면 해당 자원을 삭제
    - auto_ptr을 쓰지 못할 때 대안으로 사용하기 아주 좋음

  • 두 객체가 서로를 가리키는, 고리를 이루는 참조상태가 발생하기도 함

  • STL 컨테이너의 원소로 사용 가능
    - 복사가 '정상적' 으로 작동하기 때문에

📢 auto_ptr, shared_ptr은 동적으로 할당 된 배열에 대해서는 사용 불가!

  • auto_ptr, Shared_ptr의 소멸자는 delete[] 연산자가 아닌 delete 연산자를 사용하기 때문
  • 컴파일 에러가 발생하지 않으므로 주의 해야 함!
  • boost의 scoped_array, shared_array가 해당 기능을 수행 함!
profile
오코완~😤😤

0개의 댓글

관련 채용 정보