본문 바로가기
프로그래밍

스마트 포인터

by violetoz 2013. 5. 14.

http://process3.blog.me/20026509730

 오늘은 블로그를 오래간만에 블로그를 씁니다. 솔직하게는 귀차니즘에 빠져서 블로그 업데이트를 하지 못했습니다.(변명이지만... 날씨가 너무 떠와서^^;;;)

 

 그리고 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()을 해주어야 한다.

 

 

스마트 포인터에 사용 하는 코드는 제가 직접 만든게 아니라 코드프로젝트에서 가져왔습니다.

다만 사용하는 이유 개념등에 대해서 제가 정리했습니다.

출처 : http://www.codeproject.com/cpp/ismart.asp

'프로그래밍' 카테고리의 다른 글

비트맵에 대하여  (0) 2013.05.14
BMP 구조4  (0) 2013.05.14
Hexagon  (0) 2013.05.14
보간  (0) 2013.05.14
palindrome 회문  (0) 2013.05.14