counted_ptr 구현

2015. 7. 28. 05:46엘키스공간/엘키스코딩공방

728x90
728x90

서론

스마트 포인터를 공부하며 참조 카운팅 형식으로 객체 관리하는 클래스를 만들어보았다.

물론 소스를 참고했지만.. 이게 구현하다보니 어디서 다운 받았는지 기억이............


구현

counted_ptr.h (템플릿)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#pragma once 
 
// counted_ptr
template <class T>
class counted_ptr 
{
public:
    // 포인터를 이용한 초기화 new를 통해 초기화한다.
    explicit counted_ptr (T* p = 0) : m_ptr(p), m_count(new long(1)) { }
 
    // 복사 생성자
    counted_ptr (const counted_ptr<T>& p) throw() : m_ptr(p.m_ptr), m_count(p.m_count)
    {
        // 카운터 증가
        (*m_count)++;
    }
 
    // 소멸자
    ~counted_ptr () throw() { dispose(); }
 
    // 대입 연산자 오버로딩
    counted_ptr<T>operator= (const counted_ptr<T>& p) throw() 
    {
        // 자신인 경우를 생각해야하므로 
        if (this != &p) 
        {
            dispose();
            m_ptr = p.m_ptr;
            m_count = p.m_count;
            (*m_count)++;
        }
        return *this;
    }
 
    // * 연산자 오버로딩
    T& operator*() const throw() { return *m_ptr; }
 
    // -> 연산자 오버로딩
    T* operator->() const throw() { return m_ptr; }
 
private:
    // 내부함수 정의
    void dispose() 
    {
        // 카운터를 감소시키고 그 값이 0이면 메모리를 해제
        --(*m_count);
        if (*m_count == 0
        {
            delete m_count;
            delete m_ptr;
        }
    }
 
#ifdef __TEST
    // 원래는 인터페이스로 제공되선 안되는 함수지만 테스트를 위해!
public:
    // 카운터 갯수를 얻는 함수
    inline int getCount() { return *m_count; }
#endif
 
    // 맴버 변수
private:
    // 값을 담을 포인터
    T* m_ptr;      
    // 공유하는 숫자
    long* m_count;   
};
cs


main.cpp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// CountedPtr.cpp : 콘솔 응용 프로그램에 대한 진입점을 정의합니다.
//
 
#include "stdafx.h"
 
// 테스트를 위한 카운트 갯수 가져오기
#define __TEST
#include "counted_ptr.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
    // 새로 추가하며 카운트가 1
    printf("@새로운 포인터 생성\n");
    counted_ptr<int> numPtr (new int(3));
    printf("카운트 갯수 = %d\n\n", numPtr.getCount());
 
    {
        printf("----------새로운 지역 시작----------\n");
        // 복사 생성자로 같은 메모리를 가리키는 포인터를 선언한다.
        // 카운트는 2
        printf("@복사 생성자로 포인터 새로 생성\n");
        counted_ptr<int> newPtr(numPtr);
        printf("카운트 갯수 = %d\n", numPtr.getCount());
        // 지역이 끝나며 스택에서 해제
        printf("----------지역 끝---------\n\n");
    }
 
    // 지역이 끝나면서 newPtr이 해제가 되며 갯수는 1개가 나온다.
    printf("카운트 갯수 = %d\n", numPtr.getCount());
 
    return 0;
    // 디버깅을 통해 프로그램 종료시 소멸자를 호출하여
    // dispose 함수로 마지막 메모리를 삭제하고 프로그램을 종료한다.
}
cs





728x90
반응형