정체불명의 모모
[스마트 포인터] Shared_ptr 알아보기(구현) 본문
오늘은 스마트 포인터 중 Shared_ptr에 대해서 알아 보겠습니다.
std::shared_ptr
#include<memory>
#include"Vector.h"
int main()
{
std::shared_ptr<Vector> vector = std::maked_shared<Vector>(10.0f, 30.0f);
}
두개의 포인터를 소유합니다. 데이터를 가리키는 포인터와 제어 블록을 가리키는 포인터입니다.
std::unipue_ptr 와 달리, 포인터를 다른 std::shared_ptr와 공유할 수 있습니다.
참조 카운팅 기반이라 할 수 있습니다.
원시 포인터는 어떠한 std::shared_ptr에게도 참조되지 않을 때 소멸됩니다.
포인터 재설정 하기
std::shared_ptr<Vector> vector = std::maked_shared<Vector>(10.f , 30.0f);
std::shared_ptr<Vector> copiedVector = vector;
vector.reset(); // 해제(참조 카운팅 -1)
원시 포인터를 해제 합니다. 참조 카운트가 1줄어듭니다. nullptr 를 대입하는 것과 같습니다.
아래의 코드는 구글링 하여 찾아본 간결한 코드 입니다.
[ shared_ptr.h]
#pragma once
template <typename T>
class MyShared_ptr
{
public:
MyShared_ptr(T* object) : pointer(object), referenceCount(new int(1)) {}
~MyShared_ptr()
{
if (!--(*referenceCount))
{
delete pointer;
delete referenceCount;
}
}
// 복사 생성자 - 얕은 복사
MyShared_ptr(const MyShared_ptr& other)
{
this->pointer = other.pointer;
this->referenceCount = other.referenceCount;
(*referenceCount)++;
}
MyShared_ptr& operator = (const MyShared_ptr& other)
{
this->pointer = other.pointer;
this->referenceCount = other.referenceCount;
(*referenceCount)++;
return *this;
}
int GetReferenceCount() { return *referenceCount; }
public:
T* pointer;
int* referenceCount;
};
[메인]
#include <iostream>
#include <memory>
#include "MyShared_ptr.h"
using namespace std;
int main()
{
MyShared_ptr<int> shared_ptr1(new int(0));
MyShared_ptr<int> shared_ptr2 = shared_ptr1;
int count = shared_ptr1.GetReferenceCount();
cout << count << endl;
{
MyShared_ptr<int> shared_ptr3 = shared_ptr2;
int count2 = shared_ptr3.GetReferenceCount();
cout << count2 << endl;
}
int count3 = shared_ptr2.GetReferenceCount();
cout << count3 << endl;
return 0;
}
많은 사이트를 참고 하였습니다.(감사합니다.)
https://velog.io/@huijae0817/STL-%EA%B5%AC%ED%98%84-Sharedptr
https://jjeongil.tistory.com/1063
'프로그래밍(c++)' 카테고리의 다른 글
[C++] placement new - 전용 new (0) | 2021.08.05 |
---|---|
[C++] std::allocator<T> 클래스 (0) | 2021.08.05 |
[ C / C++ ] malloc( ) 와 new 의 차이점 (0) | 2021.07.05 |
[c++ ] c++로 List 구현 (0) | 2020.09.06 |
c++ 04 : 클래스는 객체의 설계도 [ 클래스와 객체 / 어서와c++은 처음이지] (0) | 2019.12.17 |
Comments