티스토리 뷰

게임 서버 공부를 다시 시작하면서, 먼저 메모리 구조와 포인터를 조금 이해해보고자 하였습니다. 그래서 제일 먼저 shaerd_ptr을 구현을 하려고 합니다. 참고는 memory에 있는 shared_ptr의 구조를 살짝 참조하여 만들었고, 추가적인 형태는 따로 다시 만들어볼 예정입니다.

 

아래는 코드입니다.

 

먼저 template를 사용해서 원하는 형태로 생성 할 수 있도록 하였습니다.

추가적으로 활용할만한 operator 함수들을 넣을 예정입니다.

template<typename T>
class Shared_Ptr
{
public:
	Shared_Ptr(const Ref_Count<T>* ref);
	~Shared_Ptr() { Release(); }
	
	// 복사 생성자
	Shared_Ptr(const Shared_Ptr<T>& tmp) noexcept { Set(tmp); }
	// 이동 생성자
	Shared_Ptr(Shared_Ptr<T>&& tmp) noexcept { _ref = tmp._ref; _value = tmp._value; _ref = nullptr; _value = nullptr; }

public:
	T* operator*() { return _value; }
	const T* operator*() const { return _value; }
	operator T* () const { return _value; }
	T* operator->() { return _value; }
	const T* operator->() const { return _value; }

	bool IsNull() { return _value == nullptr; }

private:
	void Release();
	void Set(const Shared_Ptr<T>& tmp);
private:
	Ref_Count<T>* _ref;
	T* _value;
};

 

다음은 shared_ptr의 단짝, make_shared도 구현하였습니다.

 

template<typename T, typename... types>
Shared_Ptr<T> Make_Shared(types&&... args)
{
	const Ref_Count<T>* tmp = new Ref_Count<T>(std::forward<types>(args)...);
	Shared_Ptr<T> ptr(tmp);

	return ptr;
}

 

테스트 코드입니다.

더보기
#include "Shared_Ptr.h"

class Test
{
public:
	Test() : _a(0) { }
	Test(int a) : _a(a) { }
	~Test() { }

	void Set(int a) { _a = a; }
	void Print() { cout << _a << endl; }
private:
	int _a;
};

int main()
{
	
	{
		Shared_Ptr<Test> ptr = Make_Shared<Test>();
		Shared_Ptr<Test> ptr2 = ptr;
		Shared_Ptr<Test> ptr3 = ptr2;

		ptr2->Print();
		ptr3->Print();
	}

	cout << "정상실행" << endl;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
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
글 보관함