SW/C++

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

얇은생각 2020. 5. 8. 07:30
반응형

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

 

std::shared_ptr

#include<memory>
#include"Vector.h"

int main()
{
  std::shared_ptr<Vector> vector = std::maked_shared<Vector>(10.f, 30.f);
  // ...
}

 

두개의 포인터를 소유합니다. 데이터를 가리키는 포인터와 제어 블록을 가리키는 포인터입니다. std::unique_ptr와 달리, 포인터를 다른 std::shared_ptr와 공유할 수 있습니다. 참조 카운팅 기반이라 할 수 있습니다. 원시 포인터는 어떠한 std::shared_ptr에게도 참조되지 않을 때 소멸됩니다.

 

 

포인터 재설정하기

std::shared_ptr<Vector> vector = std::maked_shared<Vector>(10.f, 30.f);
std::shared_ptr<Vector> copiedVector = vector;
vector.reset();

 

원시 포인터를 해제합니다. 참조 카운트가 1 줄어듭니다. nullptr를 대입하는 것과 같습니다.

 

 

참조 횟수 구하기

#include<memory>
#include"Vector.h"

int main()
{
  std::shared_ptr<Vector> vector = std::maked_shared<Vector>(10.f, 30.f);
  std::cout << "Vector : " << vector.use_count() << std::endl;
  
  std::shared_ptr<Vector> copiedVector = vector;
  std::cout << "vector: " << vector.use_count() << std::endl;
  std::cout << "copiedVector: " << copiedVector.use_count() << std::endl;
  
  return 0;
}

 

use_count는 얼마나 많은 포인터가 참조하고있는지 개수를 반환합니다.

 

 

 

예제

#pragma once

#include <memory>

using namespace std;

namespace samples
{
	class Node final
	{
	public:
		Node() = delete;
		Node(int data);
		~Node() = default;

		void SetNext(const shared_ptr<Node> next);
		shared_ptr<Node> GetNext() const;
		int GetData() const;

	private:
		int mData;
		shared_ptr<Node> mNext;
	};
}

 

#include <memory>
#include <iostream>
#include "SinglyLinkedListExample.h"
#include "Node.h"

using namespace std;

namespace samples
{
	void SinglyLinkedListExample()
	{
		shared_ptr<Node> root = make_shared<Node>(1);
		root->SetNext(make_shared<Node>(2));
		root->GetNext()->SetNext(make_shared<Node>(3));
		root->GetNext()->GetNext()->SetNext(make_shared<Node>(4));
		
		shared_ptr<Node> lastNode = make_shared<Node>(5);

		root->GetNext()->GetNext()->GetNext()->SetNext(lastNode);

		cout << "---Print linked list---" << endl;
		shared_ptr<Node> node = root;
		while (node != nullptr)
		{
			cout << node->GetData() << endl;
			node = node->GetNext();
		}

		cout << "Use count for lastNode: " << lastNode.use_count() << endl; 
	}
}

 

shared_ptr을 활용한 예제입니다. 구체적인 코드는 아래 경로에서 확인할 수 있습니다. 

 

https://github.com/POCU/COMP3200CodeSamples/tree/master/12

 

POCU/COMP3200CodeSamples

Code samples for COMP3200. Contribute to POCU/COMP3200CodeSamples development by creating an account on GitHub.

github.com

반응형