정체불명의 모모

[스마트 포인터] Shared_ptr 알아보기(구현) 본문

프로그래밍(c++)

[스마트 포인터] Shared_ptr 알아보기(구현)

정체불명의 모모 2021. 7. 15. 00:28

오늘은 스마트 포인터 중 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://agh2o.tistory.com/37

 

스마트포인터 shared_ptr 구현하기 (1)

오늘부터 여러번에 걸쳐 스마트 포인터 중에서도 shared_ptr에 대해서 자세하게 다뤄볼 예정입니다. shared_ptr을 직접 구현할 작업이 있어 해보다 재미있는 내용이 많아 포스팅 해 보려고 합니다. [ s

agh2o.tistory.com

https://velog.io/@huijae0817/STL-%EA%B5%AC%ED%98%84-Sharedptr

 

[STL 구현] Shared_ptr

스마트포인터

velog.io

https://jjeongil.tistory.com/1063

 

C++ : shared_ptr : 개념, 예제, 사용법, 구현

std::shared_ptr #include #include"Vector.h" int main() { std::shared_ptr vector = std::maked_shared (10.f, 30.f); // ... } 두개의 포인터를 소유합니다. 데이터를 가리키는 포인터와 제어 블록을 가리키..

jjeongil.tistory.com

 

Comments