항목 14: 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자
·
STUDY/Effective C++
항목13에서 본 shared_ptr(auto_ptr은 이후에 삭제되었다고한다)은 힙이 아닌 다른 자원에는 맞지않다라는 견해가 일반적이다. 하지만 모든 자원이 힙에서 생기지는 않는다. 그래서 자원 관리 클래스를 우리가 스스로 만들어야할 필요성이 있다. class Lock{ public: explicit Lock(Mutex *pm) :mutexPtr(pm) { lock(mutexPtr);} ~Lock() {unlock(mutexPtr);} private: Mutex *mutexPtr; }; 잠금을 관리하는 클래스를 하나 만들고 , RAII법칙을 따라한다고하자. Lock m11(&m); Lock m12(m11); 하지만 여기서 복사를 하게 된다면 어떻게 될까? 복사할때 이루어지는 동작과 관련해서 선택지를 고를..
항목 13: 자원관리에는 객체가 그만!
·
STUDY/Effective C++
자원을 객체에 넣음으로써, C++가 자동으로 호출해 주는 소멸자에 의해 해당 자원을 저절로 해제할 수 있다. 표준라이브러리에 auto_ptr클래스가 있는데, 이 클래스는 포인터와 비슷하게 동작하는 스마트포인터로서 가리키고있는 대상에 대해 소멸자가 자동으로 delete를 불러주도록 설계되어있다. void f() { Investment *pInv(createInvestment()); //createInvestment() 는 Investment 클래스의 객체를 동적할당하고 포인터 반환함수 ... delete pInv; } void f() { std::auto_ptrpInv(createInvestment()); ... } 위의 코드에서는 delete에 도달하기전에 빠져나갈 요소들이 분명 많아보이지만, 밑에 au..
항목 12: 객체의 모든 부분을 빠짐없이 복사하자
·
STUDY/Effective C++
복사생성자와 복사대입연산자를 통틀어 객체 복사 함수(copy function)이라고한다. 객체 복사함수는 컴파일러가 자동으로 만들어내기도하며 복사되는 객체가 갖고있는 데이터를 빠짐없이 복사하는 동작을하고있다. 하지만 컴파일러가 아닌 우리가 객체 복사함수를 만드는것이 컴파일러에게는 꽤나 기분이 나쁠 수도있다. 그래서 우리에게 복사함수 구현이 틀려도 조용히 있을경우가 있다. class Customer{ public: ... Customner(const Customer& rhs); Customer& operator=(const Customer& rhs); ... private: std::string name; }; Customer::Customer(const Customer& rhs) : name(rhs.na..
항목 11: operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자
·
STUDY/Effective C++
Widget w; w= w; //자기대입 a[i] = a[j]; //자기대입 가능성이 큼 중복참조로 인해 자기대입이 발생하는경우들이 있다. 자기대입이 발생하게되면 자원관리를 제대로 못할 수 있고 자원관리는 곧 프로그램 자체와 밀접하게 관련이 있다. Widget& Widget::operator=(const Widget& rhs) { delete pb; // 현재 비트맵 사용을 중지 pb = new Bitmap(*rhs.pb); //rhs비트맵을 사용하도록 함 return *this; } 여기서 *this와 rhs가 같은 객체일 가능성이 있다. 만약 그렇다면 rhs의 객체까지 delete가 적용되어 해당 Widget객체는 자신의 포인터멤버를 통해 가리키던 객체가 삭제되는 상태가 발생하게된다. Widget& ..