티스토리 뷰
게임 서버 공부를 다시 시작하면서, 먼저 메모리 구조와 포인터를 조금 이해해보고자 하였습니다. 그래서 제일 먼저 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;
}
'프로그래밍 언어 > C++' 카테고리의 다른 글
VirtualAlloc - PAGE 크기로 동적 할당 (0) | 2023.04.02 |
---|---|
placement new문법(객체 초기화) (0) | 2023.03.27 |
C++) STL 목차 정리 (0) | 2022.11.24 |
씹어먹는 C++) SpinLock 구현 및 15-3-1 문제 풀이 (0) | 2022.11.22 |
씹어먹는 C++) 13-2 문제 가계도 구현 (0) | 2022.11.22 |
댓글