본문 바로가기

스마트 포인터

단위 전략에 기반한 스마트 포인터의 생성자 스마트 포인터를 구현할 때, 단위 전략 기반의 스마트 포인터가 아니라면 다른 타입으로 생성된 스마트 포인터를 인자로 받는 생성자를 구현하는 것은 필수다. 예를 들어, Dervied 클래스가 Base 클래스를 상속 받았다면, 다음의 코드는 컴파일에 문제가 없어야 한다. smatr_ptr sp_b (new smart_ptr); // 또는, smart_ptrsp_b(new Derived); 이것은, 원시 포인터를 사용한 코드가 다음과 같기 때문이다. Base * pBase = new Derived; 문제는 스마트 포인터가 여러 템플릿 인자를 가지는, 단위 전략 기반의 스마트 포인터가 이런 형식의 생성을 지원해야 하는지 여부이다. 즉, 생성된 타입에 대한 정보만 .. 더보기
스마트 포인터 커스터마이즈 C++에서 최대의 단점으로 꼽히는 메모리 관리의 불편함은 스마트 포인터를 사용함으로써 어느 정도 극복할 수 있다. 하지만, 스마트 포인터는 만능이 아니며, 더군다나 연산자 오버로딩만으로 쉽게 사용할 수 있는 것은 더더욱 아니다. 물론, 앞으로 tr1에 포함된 boost::shared_ptr이 std::auto_ptr을 대신해 표준으로 포함될 예정이므로(이것은 std::auto_ptr이 없어진다는 것이 아니라, C++의 새로운 대표적인 스마트 포인터로 자리 매김할 것이라는 뜻이다) 스마트 포인터를 직접 만들어야 하는 일은 여간해서는 없겠지만, 몇몇 상황에서는 커스터마이즈된 스마트 포인터를 사용해야 할 필요성이 있다. 예컨데, 레퍼런스 카운팅 전략이 특정 상황에서는 맞지 않을 수도 있고, 현재 표준에 포함된.. 더보기
CWnd::PostNcDestroy() 일반적으로, 가장 바깥의 프레임 윈도우를 만드는데는 CFrameWnd가 사용되는데, 이것은 따로 청소 작업을 해주지 않아도 된다. 즉, CWinApp의 m_pMainWnd에 CFrameWnd에서 파생된 윈도우를 붙였다면, 이것은 따로 삭제해주지 않아도 CFrameWnd가 알아서 삭제된다. 그렇지만, 프레임 윈도우를 CFrameWnd가 아니라 CWnd에서 파생받아서 사용했고, 이것을 힙에 생성했다면, 청소 작업을 반드시 해주어야 한다. 2가지 방법이 있을 수 있는데, 가장 일반적인 방법인, PostNcDestroy() 메서드를 오버라이딩해서 자신을 삭제해주어야 한다. (delete this와 같은 방법으로) 두번째 방법은, 만약 PostNcDestroy() 메서드를 오버라이딩하지 않는다면 스마트 포인터와 .. 더보기