1. new 만 쓰면서 사용하다가 어느샌가 스마트 포인터란 녀석이 존재한다는것을 알게 되었다.
그 스마트 포인터중 C++ 표준 라이브러리 유틸리티에 포함되어 있는 auto_ptr에 대해서 익히려 한다.

#include <iostream>
#include <memory>

using namespace std;


class BABO
{
    int a, b, c;
public:
    BABO* Mythis;

    BABO()
    {    a = 3;
        b = 4;
        c = 5;
        Mythis = this;
    }
    void draw(void)
    {
        std::cout << Mythis << std::endl;
        std::cout << a << std::endl;
        std::cout << b << std::endl;
        std::cout << c << std::endl;
    }
};

int main(void)
{   
1.     auto_ptr<BABO> p(new BABO);
2.     auto_ptr<BABO> q;
   
3.     p->draw();

4.     q = p;

       //p->draw();
5.    q->draw();
}



뭐 대충 이런 코드가 있다고 치면,
1 - 1. 우선 new로 BABO의 공간을 할당 받고
void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
        {       // try to allocate size bytes
        void *p;
        while ((p = malloc(size)) == 0)
                if (_callnewh(size) == 0)
                {       // report no memory
                static const std::bad_alloc nomem;
                _RAISE(nomem);
                }

        return (p);
        }
1 - 2. BABO생성자 호출되면서 값 초기화

1 - 3. new로 인하여 주소값을 반환하면서 p에게 반환
: 컴파일 중에 auto_ptr<BABO> p 는 이미 공간이 할당된 상태이다.

2. 역시 컴파일중 q 공간 할당된 상태

4. p는 자신이 가르키고 있던 주소(동적할당 받은 주소)검증과정에서 reset 함수를 호출하고 reset과정에 이상이 없다면, p는 자신이 가르키고 있떤 주소(동적할당된 주소를 담았던 변수)변수를 tmp에 담아 두었다가 자신이 가르키고 있떤 주소(동적할당된 주소를 담았던 변수)변수를 0으로 초기화 시키고 tmp를 리턴한다. q는 이 tmp를 받으면서 초기화 한다.

다시 q-> 는 auto_ptr의 오퍼레이터 ->에 의해서 실핼되어 접근하고, 클래스 메소드에 접근해서 출력한다.

그러므로 p는 자신의 멤버변수의 값을 0으로 만들고 상대에게 남겨줌으로써 소유권을 이전했다고 한다.

... 이 auto_ptr의 경우, 사용용도로는 함수 안에서만 쓸때 사용하면 좋을것 같다.
코딩 중 소유권까지 생각하면서 이리저리 이동하다보면, 오히려 더 위험할것이라고 판단된다.

.. 더 궁금한 사항은 memory 헤더파일을 뜯어 보도록. 역시 이해하기 쉽게 되어 있다.
이게 바로 고수의 코딩인가...

신고
posted by 농사를 짓는 게임 프로그래머 최익필
TAG ,

댓글을 달아 주세요