오늘은 블로그를 오래간만에 블로그를 씁니다. 솔직하게는 귀차니즘에 빠져서 블로그 업데이트를 하지 못했습니다.(변명이지만... 날씨가 너무 떠와서^^;;;)
그리고 KBS 독립영화관이라는 사이트에서 신카이 마코토 감독의 '별의 목소리'를 1주일동안 무료 상영합니다. 기회 되시는 분들은 꼭 보세요. 이 애니메이션은 SF 애니메이션을 감수성있게 각색하는 감독의 능력을 볼수가 있습니다.
[ 스마트 포인터 ]
1) 일반적으로 우리가 사용하는 포인터는 아래와 같다.
char *a = new char[10]
...
//Do Something
...
delete a;
a = NULL;
메모리 생성후 삭제를 꼭 코드로 직접 해주어야 한다.
2) COM 기반으로 참조 회수 관리 메소드를 이용한다. (AddRef(), Release())
MyObject *obj = new MyObject
obj->AddRef()
...
//Do Something
...
obj->Release()
3) 스마트 포인터를 이용한다.
1),2)에서는 힙에 할당한 메모리에 대한 생명주기를 직접 관리해 주어야 한다. 즉, 꼭 삭제를 해주어야 한다. (삭제한 메모리는 습관적으로 초기화를 해주어야 한다.) 사람은 완벽하지 않기 때문에 메모리 삭제 코드를 실수로 빼먹는 경우가 많다
사용법
// in a body
SmartPtr<CMyObject> ptr1(new CMyObject); // construct from a pointer
SmartPtr<CMyObject> ptr2(ptr1); // construct from a smart pointer
SmartPtr<CMyObject> ptr3; // construct an empty one
ptr3 = new CMyObject; // assign a pointer
ptr1 = ptr3; // assign a smart pointer
ptr1->method1(); // call a method
ptr2 = NULL;
// etc ...
// in a function call
void f(CMyObject *ob); // function declaration
...
SmartPtr<CMyObject> ptr1(new CMyObject);
f(ptr1); // function call
// as a return value
SmartPtr<CMyObject> f1()
{
return SmartPtr<CMyObject>(new CMyObject);
}
...
SmartPtr<CMyObject> ptr;
ptr = f1();
*멀티 스레드에서 주의할것
첨부한 코드프로젝트 소스 코드에서 멀티 스레드에서 주의해야 할것이 하나 있다.
참조 회수(m_count) 를 변경할때 꼭 동기화(lock()/unlock()을 해주어야 한다.
스마트 포인터에 사용 하는 코드는 제가 직접 만든게 아니라 코드프로젝트에서 가져왔습니다.
다만 사용하는 이유 개념등에 대해서 제가 정리했습니다.