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
소멸자 호출
- shared_ptr 인스턴스인 sp가 동적 할당된 TEST 객체를 가라키고 있고 이때 카운트는 1로 변경됩니다.
- 새로운 코드 블록에서 sp2가 생성되고 sp2를 sp가 가리키는 개체를 가리키게 초기화하면 카운트가 2로 변경됩니다.
- 블록이 끝나고 sp2가 소멸되면 카운트가 1로 변경되는 걸 볼 수 있습니다.
- 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);
}
// 출력 결과
생성자 호출
생성자 호출
생성자 호출
소멸자 호출
소멸자 호출
소멸자 호출