์ค๋์ ์ค๋งํธ ํฌ์ธํฐ ์ค...
๋ ๋ฒ์งธ์ธ shared_ptr์ ๋ํด์ ์์๋ณผ๊ฑฐ๋ค
์์ฆ ๋ค์ด๋ฒ ๋ธ์ฑ ์ด๋ฒคํธ๋ฅผ ํ๊ณ ์๋๋ฐ
๊ฐ์ด๋ฐ ์ ๋ ฌ๋ก ํ๋๊น ์ฌ์ง ์ฒจ๋ถํ๊ธฐ๊ฐ ๋๋ฌด ์ข์์ด์
์ผ์ชฝ์ ๋ ฌํ์๋๋ฐ ๋ฐ๊ฟ ๋ณด๋ ค๊ณ ํ๋ค ^_^
++ ์ด์ ๊ธ ์ฌ๋ฆฌ๊ณ ๋ค์ ๋ ์ฌ๋ฆด๋ ค๊ณ ํ๋๋ฐ
๋ค๋ฅธ๊ฑธ ๋จผ์ ์ฌ๋ ธ๋๋ ์ํ์ง ๋ป ํ๋ค
1. ์ค๋งํธ ํฌ์ธํฐ์๋ ๋ญ๊ฐ ์์ง?
์ค๋งํธ ํฌ์ธํฐ๋ 3๊ฐ์ง๊ฐ ์๋ค
1) unique_ptr
2) shared_ptr (์ค๋ํ ๊ฑฐ)
3) weak_ptr
1-1) unique_ptr์ด ๋ญ์๋๋ผ (๋งํฌ ์ฒจ๋ถ ^^)
์ฒซ ๋ฒ์งธ, unique_ptr์ ํฌ์ธํฐ๋ฅผ ํตํด Uniqueํ ์์ ๊ถ์ ๊ฐ์ง๊ณ
unique_ptr ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋งํธ ํฌ์ธํฐ์ด๋ค
๋ ๋ฒ์งธ, make_unique() ๋๋ new๋ฅผ ์ฌ์ฉํด์ ์์ฑํ ์ ์๋ค
์ธ ๋ฒ์งธ, ๊ณ ์ ํ ์์ ๊ถ์ด ์๊ธฐ ๋๋ฌธ์, ๋ณต์ฌ ๋์ move๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํํ๋ค
2. shared_ptr
unique_ptr์ ๊ณ ์ ํ.... ์ ๋ํฌํ ๋๋์ด ๋๋ ์ด๋ฆ์ด์๋๋ฐ
shared๋ ๋ญ๊ฐ ๊ณต์ ํ๋ ๊ณต์ ๋ ๊ฒ ๊ฐ์ ๋๋์ด ๋ ๋ค
๋ฐ๋ก ์ฌ์ฉ ์์๋ก ๋์ด๊ฐ๋๋ก ํ๊ฒ ๋ค
#include <memory>
#include <iostream>
using namespace std;
int main ( )
{
std::shared_ptr<int> ptr = std::make_shared<int>(10);
cout << ptr << endl;
cout << *ptr << endl;
return 0;
}
์~ ptr ์ถ๋ ฅํ๋ฉด 10์ด ๋์ค๊ฒ ์ง? ใ ํ๋ฉด ์๋๋ค
์์์์ ์ฌ์ฉํ ๊ฒ ์ฒ๋ผ, ptr ์์ฒด๋ฅผ ์ถ๋ ฅํ๋ฉด ํฌ์ธํฐ๊ธฐ ๋๋ฌธ์
ํฌ์ธํฐ์ ์ฃผ์๊ฐ์ด ๋์ค๊ณ ,
* ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๊ฐ์ธ 10์ด ๋์จ๋ค
↓
๋ํ shared๋ผ๋ ์ด๋ฆ์์ ๋๋์ด ์ค๋ฏ์ด
unique_ptr๊ณผ ๋ค๋ฅด๊ฒ shared_ptr์ ๋ณต์ฌ(copy)๊ฐ ๋๊ณ
๊ฐ์ ๊ฐ์ ๊ฐ๋ฅดํค๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค
int main ( )
{
std::shared_ptr<int> ptr = std::make_shared<int>(10);
cout << *ptr << endl;
std::shared_ptr<int> ptr_cp = ptr;
cout << *ptr_cp << endl;
return 0;
}
ptr_cp๋ผ๋ shared_ptr์ ptr์ ๊ฐ์ ํ ๋นํด๋
์ํ๋ ๊ฒฐ๊ณผ๊ฐ ๋์จ ๋ชจ์ต์ด๋ค
์๊ฑธ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค
Diagram1์ ๋ณด๋ฉด, Control Block์ด๋๊ฑธ p1์ด ์ฐธ์กฐํ๊ณ ์๋ค
์ฌ๊ธฐ์ p1์ shared_ptr ํ์ ์ ๋ณ์๋ฅผ ๋ปํ๊ณ
ํฌ์ธํฐ๋๊น ์ฃผ์ ๊ฐ์ ๊ฐ์ง๋ค(์ฐธ์กฐํ๋ค)๊ณ ์ดํดํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค
2-1) Reference Count (์ฐธ์กฐ ํ์)
shared_ptr์๋ ์ฐธ์กฐํ์๋ผ๋ ๊ฐ๋ ์ด ์๋ค
unique_ptr๊ณผ๋ ๋ค๋ฅด๊ฒ shared_ptr๋ ์๊ธฐ ํฌ์ธํฐ๋ฅผ ๊ฐ๊ณ ์๋ ๋์
์์ ๊ถ์ ๊ณต์ ํ ์ ์๊ฒ ํด์ค๋ค
(ํฌ์ธํฐ์ ์ฃผ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ถ์ ๋๋ get()์ ์ฌ์ฉํ ์ ์๋ค)
์์ ๊ถ์ด ๋์ด๋ ๋(์ฌ์ฉ ํ์๊ฐ ๋์ด๋ ๋) ์ฐธ์กฐ ํ์๋ ์ฆ๊ฐํ๋ค
๋ํ shared_ptr ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๊ฒ์ด ์๋ฌด๋ ์์ผ๋ฉด ์ฐธ์กฐ ํ์๋ 0์ด ๋ ์ ์๋ค
์ฐธ์กฐ ํ์๋ use_count() ๋ก ๊ฐ์ ธ์ค๋ฉด ๋๋ค
๊ทธ๋ฆผ์ผ๋ก ๋ด๋ณด์ฅ
Diagram2๋ฅผ ๋ณด๋ฉด, Diagram 1์ฒ๋ผ Control Block์ p1๊ณผ p2๊ฐ ์ฐธ์กฐํ๊ณ ์๋ค
๋ค๋ฅธ ์ ์, p1๋ ์ฐธ์กฐํ๊ณ → ์ฐธ์กฐ ์นด์ดํธ +1
p2๋ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ → ์ฐธ์กฐ ์นด์ดํธ +1
๊ทธ๋ฆผ ์๋จ์ Ref count๊ฐ 2๊ฐ ๋ ๊ฒ์ ๋ณผ ์ ์๋ค
์ฐธ์กฐํ๊ณ ์๋ p1๊ณผ p2๊ฐ ๋ชจ๋ ์ฌ๋ผ์ง๋ฉด, Ref count๋ 0์ด ๋๋๋ฐ
๊ทธ๋ฌ๋ฉด ์๋์ผ๋ก ์ญ์ ๊ฐ ๋์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ก ํด์ ํ์ง ์์๋ ๋๋ค
๋ง์ด ์ด๋ ต์ง๋ง ์ฝ๋๋ก ์ถ๋ ฅ ๋ช ๋ฒ ํด๋ณด๋ฉด ์ ์ ์๋ค
int main ( )
{
std::shared_ptr<int> ptr = std::make_shared<int>(10);
cout << *ptr << endl;
std::shared_ptr<int> ptr_cp = ptr;
cout << *ptr_cp << endl;
std::shared_ptr<int> ptr_cp2 = ptr_cp;
cout << "Ref Count: " << ptr.use_count() << endl;
return 0;
}
ptr์ use_count๊ฐ 3์ผ๋ก ์ถ๋ ฅ์ด ๋๋ค
1) ptr์ ๋ํด make_shared๋ก ๋ง๋ค์ด์ ์นด์ดํธ ์ฆ๊ฐ
2) ptr ํฌ์ธํฐ๋ฅผ ptr_cp์์๋ ๊ฐ๊ณ ์์
3) ptr์ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ ptr_cp์ ํฌ์ธํฐ๋ฅผ ptr_cp2์์๋ ๊ฐ๊ณ ์์
(ptr์ ํฌ์ธํฐ๋ฅผ ๊ฐ์ง)
์์๋ฅผ ํ๋ ๋ ๋ค์ด๋ณด๊ฒ ๋ค
ptr์ ์ฌ์ฉ์ํ๋ฉด ์ฐธ์กฐ ์นด์ดํธ๋ ์๋์ผ๋ก ์ค์ด๋๋์ง
ํ์ธํ๊ธฐ ์ํด์, ์ง์ญ ํจ์์์
shared_ptr ํฌ์ธํฐ๋ฅผ ๋ณต์ฌํ๋๋ก ํด๋ณด๊ฒ ๋ค
void func(shared_ptr<int> ptr)
{
std::shared_ptr<int> ptr_cp = ptr;
cout << *ptr_cp << endl;
std::shared_ptr<int> ptr_cp2 = ptr_cp;
cout << __func__ << "::Ref Count: " << ptr.use_count() << endl;
}
int main ( )
{
std::shared_ptr<int> ptr = std::make_shared<int>(10);
cout << *ptr << endl;
func(ptr);
cout << __func__ << "::Ref Count: " << ptr.use_count() << endl;
return 0;
}
main์์๋ shared_ptr ๊ฐ์ฒด์ธ ptr๋ง ๋ง๋ค์ด์คฌ๊ณ
func() ํจ์์์ ๊ฐ ๋ณต์ฌ๊ฐ ์ํ๋๋ค
๊ทธ๋ฆฌ๊ณ ํ๋ผ๋ฏธํฐ๋ก ํฌ์ธํฐ๋ฅผ ๋๊ฒจ์ฃผ๋ฉด์ Ref count๋ ํ๋ ๋ ์ฆ๊ฐํ๋ค
ํจ์๊ฐ ์ข ๋ฃ๋ ํ์๋ func()์์ ์ํํ ์ฐธ์กฐ๋ ์์ด์ก๊ธฐ ๋๋ฌธ์
main์์๋ ๋ค์ Ref Count๊ฐ 1๋ก ๋์๋ค
3. shared_ptr๋ฅผ value๋ก ๊ฐ๋ ์๋ฃ๊ตฌ์กฐ
shared_ptr์ map์ด๋ vector ๊ฐ์ ์๋ฃ๊ตฌ์กฐ์์
value ๊ฐ์ผ๋ก๋ ๋ง์ด ์ฐ์ธ๋ค
map์ ๊ฐ์ธ๋ ๋ชจ์์ผ๋ก๋ ์ฐ์ด๊ธด ํ์ง๋ง
ํฌ์ธํฐ๋ก ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค๋ฉด ๊ตณ์ด?
๋ฐ๋ก ์์๋ฅผ ๋ณด๋ฉด์ ์ค๋ช ํ๋๋ก ํ๊ฒ ๋ค
#include <map>
int main ( )
{
map<string, shared_ptr<int>> mapTest;
auto ptr = make_shared<int>(10);
cout << __func__ << "::Ref Count: " << ptr.use_count() << endl;
mapTest["first"] = ptr;
cout << __func__ << "::Ref Count: " << ptr.use_count() << endl;
for( auto const &val : mapTest )
{
cout << val.first << ": " << *val.second << endl;
}
return 0;
}
์ด๋ ๊ฒ map์ value ๊ฐ์ผ๋ก๋ ์ฌ์ฉํ ์ ์๋ค
map์ด ์๋ฉธ๋๋ค๋ฉด value๋ก ์๋ shared_ptr์ ์๋ฉธ์๋ ์๋์ผ๋ก ๋ถ๋ฆฐ๋ค
๋ฐ๋ก ๊ด๋ฆฌ ์ํด์ค๋ ๋จ
ํธํ๊ฒ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ง๋ง
ํฌ์ธํฐ๋ ํฌ์ธํฐ๊ธฐ ๋๋ฌธ์ ํญ์ ์กฐ์ฌํ๋๋ก ํ์
์ฐธ๊ณ ์๋ฃ
https://en.cppreference.com/w/cpp/memory/shared_ptr/use_count
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Error ํด๊ฒฐ: boost::shared_ptr<boost::asio::io_context>::operator* (0) | 2022.02.04 |
---|---|
STRUCT์ UNION์ ์์๋ณด์ (0) | 2021.07.12 |
Error ํด๊ฒฐ: undefined reference to `vtable for XXX' (0) | 2021.06.24 |
Boost-echo tcp client & server๋ฅผ ์ดํด๋ณด์ (1) (2) | 2021.06.11 |
C++ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์์๋ณด์ - (1) unique_ptr (0) | 2021.05.25 |