C++์๋ ์์ฃผ ์ ์ฉํ ๊ฐ๋ ์ด ์๋ค
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ํ ๋๋ง๋ค ๊ณ ๋ คํด์ผํ ์ ์ ๋ฐ๋ก "๋ฉ๋ชจ๋ฆฌ ๋์"์ธ๋ฐ,
๊ทธ๊ฒ์ ๋ํด ์กฐ๊ธ์ ์์ ๋กญ๊ฒ ์๊ฐํ ์ ์๋ ์ค๋งํธ ํฌ์ธํฐ๋ผ๋ ๊ฒ์ด๋ค
๊ฐ์ฅ ์์ฃผ ์ฌ์ฉํ๋๊ฑด shared_ptr์ด์๋๋ฐ,
์ฌ๋ฌ ๊ฐ๊ฐ ์๋๊ฑด ์ด์ ๊ฐ ์๋ค๋ ์๊ฐ์ด ๋ค์ด์
ํ๋์ฉ ์ ๋ฆฌํ๋ ค๊ณ ํ๋ค
(๋ชจ๋ C++ ์ ๋ฌธ ๊ต์ฌ๋ฅผ ์ฐธ๊ณ ํด์ ์์ฑํ์์ต๋๋ฅ)
1. ์ค๋งํธ ํฌ์ธํฐ์๋ ๋ญ๊ฐ ์์ง?
์ค๋งํธ ํฌ์ธํฐ๋ 3๊ฐ์ง๊ฐ ์๋ค
1) unique_ptr (์ค๋ํ ๊ฑฐ)
2) shared_ptr
3) weak_ptr
์๋ ๊ฒ 3๊ฐ์ง ์ธ๋ฐ, ์ฐธ๊ณ ๋ก ์ค๋งํธ ํฌ์ธํฐ๋ C++ 11์์ ๋์ ๋ ๊ฐ๋ ์ด๋ค
C++ 03์๋ auto_ptr๋ผ๋ ๊ฒ๋ ์๋ค๊ณ ํ๋ค -_-a ํ์ง๋ง ์ญ์ ๋จ ์ฐ์ง๋ง์
1-1) ์ค๋งํธ ํฌ์ธํฐ ํค๋๋?
#include <memory>
or
#include "boost/shared_ptr.hpp"
๊ธฐ๋ณธ STL์์ ์ ๊ณตํ๋ ์ค๋งํธ ํฌ์ธํฐ๋ <memory> ํค๋์์ ์ธ ์ ์๋ค
๊ทผ๋ฐ C++11์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ธ๋ฐ, C++ 11์ ์ฌ์ฉํ ์ ์์ ์๋ ์๋ค...
๊ทธ๋ด ๋๋ Boost์ ์๋๊ฑธ ์ฌ์ฉํ๋ฉด ๋๋ค๊ณ ํ๋ค
1-2) ๊ทธ๋ฅ ํฌ์ธํฐ๋ฅผ ์ฐ๋ฉด ์๋๋๊ฑด๊ฐ?
์จ๋ ๋๋ค ใ
์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉ์์ ํฐ ์ฅ์ ์ ์ฌ์ฉํ๋ ํฌ์ธํฐ๊ฐ ๋ง๋ฃ๋๋ฉด
๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋์ผ๋ก ํด์ ๋๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฐจ์์์ ํธํ๋ค
ํ์ง๋ง ๊ตฌํํ๋๋ฐ๋ ์กฐ๊ธ ๊น๋ค๋กญ๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์ธ ์ ์์ผ๋๊น
์ ์๊ณ ์ฌ์ฉํ์ ใ
2. unique_ptr
์ด๋ฆ์์ ๋๊ปด์ง๋๊ฐ... ๋ญ๊ฐ ์ ๋ํฌํ๋ค
์ ๋ํฌํ ๊ฒ ๊ฐ์ ๋๋์ด ๋ ๋ค..
unique_ptr์ ํฌ์ธํฐ๋ฅผ ํตํด Uniqueํ ์์ ๊ถ์ ๊ฐ์ง๊ณ
unique_ptr ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์ฒ๋ฆฌํ๋ ์ค๋งํธ ํฌ์ธํฐ์ด๋ค
๋ฐ๋ก ์ฌ์ฉ ์์๋ฅผ ๋ณด๊ฒ ๋ค
#include <memory>
#include <iostream>
using namespace std;
int main(void)
{
std::unique_ptr <int> ptr(new int(10));
cout << *ptr << endl;
return 0;
}
๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํฌ์ธํฐ์ ๋ํด์๋ new๋ก ์์ฑ ํด์คฌ๊ณ ,
ํฌ์ธํฐ์ด๊ธฐ ๋๋ฌธ์ *ptr๋ก ๊ฐ์ ์ถ๋ ฅ์ ํด์ค ์์ ์ด๋ค
ํด๋น ํฌ์ธํฐ๋ ๋ง๋ฃ๋๋ฉด ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋์ผ๋ก ํด์ ๋ ๊ฒ์ด๋ค
๋ฉ๋ชจ๋ฆฌ๋ ์๋์ผ๋ก ํด์ ๋์ง๋ง, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ํ ๋นํด์ฃผ์ง ์์๋ค๋ฉด
core๊ฐ ๋ฐ์ํ๊ฑฐ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค
2-1) unique_ptr์ด uniqueํ ์ด์
unique_ptr์ ์ ๋ํฌ!!! ๊ณ ์ ํ!!! ํฌ์ธํฐ๋ผ๋ ์ด๋ฆ์ ๊ฐ๊ณ ์๋ ์ด์ ๊ฐ ์๋ค..
์๋๋ฉด, ๋ค๋ฅธ ํฌ์ธํฐ ํ์ ์ ํ ๋น๋๊ฑฐ๋ ๋ณ๊ฒฝํ ์ ์๋ค
๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ฐ๊พผ๋ค๊ณ ํ๋ค๊ฑฐ๋,
๋ค๋ฅธ unique_ptr ๋ณ์์ ํ ๋นํ๋ ค๊ณ ํ๋ค!? ํ๋ฉด
์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋ฐ ๊ฒ์ด๋ค
"error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]"
ํฌ์ธํฐ๊ฐ ๊ฐ๋ฅดํค๋ ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ ์ถ๋ค๋ฉด get()์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค
๋ฐ๋ก ์๋ ๊ฒ
#include <memory>
#include <iostream>
using namespace std;
int main(void)
{
std::unique_ptr <int> ptr(new int(10));
cout << *ptr << endl;
int* raw_ptr = ptr.get();
cout << *ptr << endl;
return 0;
}
unique_ptr์ ๋ค๋ฅธ unique_ptr์ ํ ๋นํ๋ ๊ฒ๋ ์๋๋ค
int main(void)
{
std::unique_ptr <int> ptr(new int(10));
cout << *ptr << endl;
/* ์๋ฌ ๋ฐ์ */
std::unique_ptr <int> ptr_cp{ptr};
cout << *ptr_cp << endl;
return 0;
}
์์์ ์ธ๊ธํ ๊ฐ์ ์๋ฌ๊ฐ ๋ ๊ฒ์ด๋ค ใ
unique_ptr์ ์ด๋๋ง ํ ์ ์๋ค
์ด๋์ ๋ฌด์จ ํจ์๋... move() ๋ค
std::unique_ptr <int> ptr_cp{move(ptr)};
๋ฐ๋ก ์ด๋ ๊ฒ ใ
move() ๋ถํ์ํ ๋ณต์ฌ๋ฅผ ํผํ๋ ค๊ณ ํธ๋ฆญ์ ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ธ๋ฐ
๊ทธ๋ฆผ์ ๋น๋ ค ์ค๋ช ํ์๋ฉด
ptrA์ Song ๊ฐ์ฒด์ ์์ ๊ถ์ด ๋ถ์ฌ๋๊ณ ,
move๋ฅผ ํ๋ฉด ๊ทธ ์์ ๊ถ์ ๊ทธ๋๋ก ptrB์ ๋๊ฒจ์ฃผ๊ฒ ๋๋ค
ptrA๋ nullptr์ด ๋๋คใ
์ ๋ฆฌํ์๋ฉด unique_ptr์ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ ํ๋ ๋ณต์ฌ(copy)๋ ์๋ผ์
์๋ ์ฃผ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๋ ์ด๋(move)์ ๋ผ์
→ ๊ณ ์ ํ ์์ ๊ถ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค
2-2) unique_ptr์ ์์ฑํ๋ ๋ฐฉ๋ฒ์ new๋ฟ์ธ๊ฐ?
์๋๋คใ
๋ฌผ๋ก ์ด๋ ๊ฒ๋ ๋ง์ด ์ฐ๋๋ฐ, C++ 14 ๋ถํฐ ์ ๊ณตํ๋ make_unique()๋ฅผ ์ฐ๋ฉด
๋ ์์ ํ๊ณ ์ฝ๋์ ํต์ผ์ฑ์ ์ค ์ ์๋ค
int main(void)
{
std::unique_ptr <int> ptr = make_unique<int>(10);
cout << *ptr << endl;
return 0;
}
๋ฐ๋ก ์ด๋ ๊ฒใ
new๋ก ์ฌ์ฉํ๋๊ฒ ์ต๊ด์ด ๋์๋๋ฐ, make ํจ์๋ฅผ ์ฌ์ฉํ๋๋ก ํด์ผ๊ฒ ๋น
2-3) unique_ptr์ return ๋ฐ์ผ๋ฉด ์์ ๊ถ์?
ํฌ๊ฒ ์๊ฐ์ํด๋ ๋๋ค
์์๋ก ๋ฐ๋ก ๊ธ๊ธ
std::unique_ptr<int>
unique_func()
{
return std::unique_ptr<int>{new int(10.0)};
}
int main(void)
{
auto ptr = unique_func();
cout << *ptr << endl;
return 0;
}
์๋ ๊ฒ ๋๋ฉด unique_ptr์ ํจ์์์ ๋ฐํํ ๋
๋ฉ๋ชจ๋ฆฌ์ ์์ ๊ถ์ ์ ๋ฌํ๊ธฐ ๋๋ฌธ์, ์ด ๊ฒฝ์ฐ์๋ move๋ฅผ ํ์ง ์์๋ ๋๋ค
2-4) ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ง์ฐ๊ณ ์ถ๋ค๋ฉด?
์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ์๋
์์์ delete๊ฐ ๋๋ค๊ณ ์๊ณ ์์ง๋ง... ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ด๊ฐ ์ง์ฐ๊ณ ์ถ์ ์๋ ์์ง ์์๊ฐ
๊ทธ๋ด๋๋ reset()์ด๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค
int main(void)
{
std::unique_ptr <int> ptr(new int(10));
cout << *ptr << endl;
std::unique_ptr <int> ptr_cp{move(ptr)};
cout << *ptr_cp << endl;
ptr_cp.reset();
if( !ptr_cp )
cout << "nullptr" << endl;
else
cout << *ptr_cp << endl;
return 0;
}
์๋ ๊ฒ ํ๋ฉด nullptr์ด๋ผ๋ ๋ฌธ์์ด์ด ์ถ๋ ฅ๋๋ค
ptr_cp์๋ ptr์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ moveํ์ฌ ๊ฐ๊ณ ์๋๋ฐ,
ptr_cp์ ๋ํด์ reset()์ ํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ญ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค
๋ด์ผ์ shared_ptr ๊ณต๋ถํ ๋
'๐ C๋ C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Error ํด๊ฒฐ: undefined reference to `vtable for XXX' (0) | 2021.06.24 |
---|---|
Boost-echo tcp client & server๋ฅผ ์ดํด๋ณด์ (1) (2) | 2021.06.11 |
Boost Asio์ ๋ํด์ ์์๋ณด์ (6) | 2021.05.20 |
C++ ํด๋์ค ๋ฉค๋ฒ๋ณ์ ์ด๊ธฐํ๋ฅผ ์์๋ณด์ (4) | 2021.03.25 |
C++ ๋๋ฌธ์/์๋ฌธ์ ๋ณํ (4) | 2021.02.26 |