Home [C++] 스마트 포인터 - shared_ptr
Post
Cancel

[C++] 스마트 포인터 - shared_ptr

description

shared_ptr은 포인팅 횟수(카운트)를 계산해서 카운트가 0일 될 때 대상 객체를 삭제(해제)하는 스마트 포인터입니다.

예를 들어,

A라는 객체를 N개의 shared_ptr 포인터로 가라키게 된다면 카운트는 N이 됩니다.

그리고 여기서 1개의 shared_ptr 포인터가 소멸된다면 A 객체가 소멸되지 않고 카운트가 N-1이 됩니다.

A객체가 소멸될 때는 카운트가 0이 될 때 소멸됩니다.

위의 예시를 코드로 구현해 보면 아래와 같습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<memory>

using namespace std;

class TEST
{
public:
	TEST()
	{
		cout << "생성자 호출" << endl;
	}

	~TEST()
	{
		cout << "소멸자 호출" << endl;
	}

	void Print()
	{
		cout << "Print" << endl;
	}
};
int main()
{
	shared_ptr<TEST> sp(new TEST);

	cout <<"Count:" << sp.use_count() << endl;
	{
		shared_ptr<TEST> sp2(sp);
		cout << "Count:" << sp2.use_count() << endl;
	}

	cout << "Count:" << sp.use_count() << endl;
}

// 출력 결과
생성자 호출
Count:1
Count:2
Count:1
소멸자 호출
  1. shared_ptr 인스턴스인 sp가 동적 할당된 TEST 객체를 가라키고 있고 이때 카운트는 1로 변경됩니다.
  2. 새로운 코드 블록에서 sp2가 생성되고 sp2를 sp가 가리키는 개체를 가리키게 초기화하면 카운트가 2로 변경됩니다.
  3. 블록이 끝나고 sp2가 소멸되면 카운트가 1로 변경되는 걸 볼 수 있습니다.
  4. sp에 대한 블록이 끝남으로써 카운트가 0이 되고 객체가 소멸되어 소멸자가 호출되는 것을 볼 수 있습니다.

shared_ptr은 배열 사용이 가능하다

shared_ptr은 auto_ptr과 다르게 복수 개의 객체에 대한 처리가 가능합니다.

이 때 중요한 점은 shared_ptr 객체를 생성할 때 소멸 방법을 정의해주어야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void Release(TEST* test)
{
    delete[] test;
}

int main()
{
    shared_ptr<TEST> sp(new TEST[3], Release);
}

// 출력 결과
생성자 호출
생성자 호출
생성자 호출
소멸자 호출
소멸자 호출
소멸자 호출

방법: shared_ptr 인스턴스 만들기 및 사용

This post is licensed under CC BY 4.0 by the author.

[C++] 스마트포인터 - auto_ptr

[C++] 스마트 포인터 - unique_ptr