[ Effective C++ ] 항목 14 : 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자

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

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

[핵심]

" RAII 객체를 직접 구현할 때에는 사용 목적에 맞게 구성하는 것이 중요! "

  • RAII 객체의 복사는 그 객체가 관리하는 자원의 복사 문제를 안고 가기 때문에, 그 자원을 어떻게 복사하느냐에 따라 RAII 객체의 복사 동작이 결정!
  • RAII 클래스에 구현하는 일반적인 복사 동작은 복사를 금지하거나 참조 카운팅을 해 주는 방법을 사용 함

💡 자원 관리 클래스를 직접 만들기도 해야 한다!

📌 자원이 모두 힙에서 생기는 건 아니다...

  • auto_ptr, shared_ptr 등의 스마트 포인터로 힙이 아닌 공간의 자원을 처리하는 것은 맞지 않다는게 일반적인 견해!


💡 RAII 클래스를 직접 구현할 때 복사 동작은 어떻게?

📌 복사를 금지하자!

  • RAII 객체가 복사되도록 두는 것 자체가 말이 안되는 겅우가 많음

  • 복사 함수(복사 생성자, 복사 대입 연산자)를 private 멤버로 만들자!

📌 관리 자원에 대해 참조 카운팅 수행!

  • shared_ptr이 사용 중인 방식

  • shared_ptr을 멤버로 넣어 관리하자!
    📢 shared_ptr은 소멸자가 delete를 자동으로 부른다며? 난 삭제까지 바라지 않아!

    • shared_ptr은 삭제자를 지정할 수 있음.
    • delete 대신 원하는 동작의 함수를 사용하면 된다!
    class Lock
    {
    public:
    	explicit Lock(Mutex* pm)
        : mutexPtr(pm, UnLock)				// delete 대신 사용할 원하는 동작의
        {									// UnLock 함수 사용
        	Lock(MutexPtr.get());
        }
    private:
    	shared_ptr<Mutex> mutexPtr;
    };

📌 관리 자원을 진짜로 복사하자!

  • 자원을 다 썼을 때 각각의 사본을 확실히 해제하자!

  • 깊은 복사를 수행

📌 관리 자원의 소유권을 옮기자!

  • auto_ptr의 복사 동작과 동일!
  • 자원을 실제로 참조하는 RAII객체가 딱 하나 였으면 할 때 사용
profile
오코완~😤😤

0개의 댓글

관련 채용 정보