반응형
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을 활용한 예제입니다. 구체적인 코드는 아래 경로에서 확인할 수 있습니다.
반응형
'SW > C++' 카테고리의 다른 글
C++ : shared_ptr 와 weak_ptr : 개념, 차이, 활용법, 예제, 구현 (0) | 2020.05.10 |
---|---|
C++ : weak_ptr : 약한 참조 개념, 사용법, 예제, 구현 (0) | 2020.05.09 |
C++ : 자동 메모리 관리, 가비지 컬렉션, 참조 카운트 : 개념, 관계, 장단점 (0) | 2020.05.07 |
C++ : unique_ptr : 배스트 프렉티스, 기본 예제, 활용 방법, 동작 방식 (0) | 2020.05.06 |
C++ : unique_ptr : reset, get, release, move, 복사 : 개념, 예제 (0) | 2020.05.05 |