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
반응형
'엘키스공간 > 엘키스코딩공방' 카테고리의 다른 글
[잡다한코딩] 플로이드워셜 알고리즘 짜보기 (2) | 2017.01.07 |
---|---|
[잡다한코딩] Map insert로 뭘 쓰지? (1) | 2016.12.21 |
[잡다한코딩] 조건에 따라 enum 값 리턴하는 람다펑션 만들어보기 (4) | 2016.12.11 |
비트 조작 유틸로 만들기 (0) | 2015.07.13 |
더블 링크드 리스트 (1) | 2015.06.21 |
싱글 링크드 리스트 (0) | 2015.06.21 |
큐로 메시지 큐 구현하기 (0) | 2015.06.10 |