์ค๋งํธ ํฌ์ธํฐ ํ ํ๋ฆฟ ํด๋์ค
smart pointer๋ ํฌ์ธํฐ์ฒ๋ผ ํ๋ํ๋ ํด๋์ค ๊ฐ์ฒด์ง๋ง, ๋ช ๊ฐ์ง ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ง๋๋ค. ๋์ ๋ฉ๋ชจ๋ฆฌ ๋์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ค๋งํธ ํฌ์ธํฐ ํ ํ๋ฆฟ์ ๋ํด ์์๋ณด์
์ค๋งํธ ํฌ์ธํฐ์ ์ฌ์ฉ
3๊ฐ์ ์ค๋งํธ ํ ํ๋ฆฟ (auto_ptr, unique_ptr, shared_ptr)์ ๊ฐ๊ฐ new๋ฅผ ํตํด ์ป์ด์ง๋ ์ฃผ์๋ฅผ ๋์ ํ ํฌ์ธํฐ๋ฅผ ์ ์ํ๋ค.
์ค๋งํธ ํฌ์ธํฐ๊ฐ ์๋ช ์ ๋คํ์ ๋, ํ๊ดด์๋ delete๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ค. ๋ฐ๋ผ์ ๋ง์ผ new๊ฐ ๋ฆฌํดํ๋ ์ฃผ์๋ฅผ ์ ์ธ ๊ฐ์ ๊ฐ์ฒด ์ค ํ๋์ ๋์ ํ๊ฒ ๋๋ฉด, ๋์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ค๋งํธ ํฌ์ธํฐ ๊ฐ์ฒด๊ฐ ์๋ช ์ด ๋คํ์ ๋, ์๋์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ๊ฐ ํด์ ๋๋ค.
์ด๋ฌํ ์ค๋งํธ ํฌ์ธํฐ ๊ฐ์ฒด๋ค ์ค ํ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด์๋ ํ ํ๋ฆฟ์ ์ ์ํ๋ memory ํค๋ ํ์ผ์ ์์ค์ฝ๋์ ํฌํจํด์ผ ํ๋ค. ๊ทธ ํ, ์ผ๋ฐ์ ์ธ ํ ํ๋ฆฟ ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ ํ์ํ ํฌ์ธํฐ์ ์ข ๋ฅ๋ฅผ ๊ตฌ์ฒดํํ๋ค.
auto_ptr ํ ํ๋ฆฟ
template<class X>class auto_ptr {
public:
explicit auto_ptr(X*p =0) throw();
...};
(throw()๋ ์ด ์์ฑ์๊ฐ ์์ธ๋ฅผ ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธ)
๋ฐ๋ผ์ Xํ์ ์ auto_ptr ๊ฐ์ฒด๋ฅผ ์์ฒญํ๋ฉด, Xํ์ ์ ๊ฐ๋ฆฌํค๋ auto_ptr ๊ฐ์ฒด๋ฅผ ์ป์ ์ ์๋ค.
auto_ptr<double> pd(new double);
auto_ptr<string> ps(new string);
์ฌ๊ธฐ์, new double์ new๊ฐ ๋ฆฌํดํ ์๋ก ๋์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ก auto_ptr<double>์ ๋งค๊ฐ๋ณ์์ด๋ค.
3๊ฐ์ ์ค๋งํธ ํฌ์ธํฐ ํด๋์ค ํ ํ๋ฆฟ์ ๋งค๊ฐ๋ณ์๋ก ํฌ์ธํฐ๋ฅผ ๋ฐ์๋ค์ด๊ธฐ ์ํด ๋ช ์์ (explicit) ์์ฑ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ค๋งํธ ํฌ์ธํฐ ํ ํ๋ฆฟ ํด๋์ค๋ค์ ์ผ๋ฐ ํฌ์ธํฐ์ฒ๋ผ ๋์ํ ์ ์๋ค.
์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๋๋ ๊ฒฝ์ฐ
string vatcion("I wandered lonely as a cloud.");
shared_ptr<string> pvac(&vaction); //์ฌ์ฉ ๋ถ๊ฐ
pvac๊ฐ ์๋ช ์ ๋คํ์ ๋ ํ๋ก๊ทธ๋จ์ delete ํ๋ ค๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ heap์ ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์, ์๋ชป๋จ.
์ค๋งํธ ํฌ์ธํฐ ๊ณ ๋ ค์ฌํญ
auto_ptr<string> ps(new string("abc"));
auto_ptr<string> vocation;
vocation=ps;
ps์ vacation์ด ์ผ๋ฐ ํฌ์ธํฐ๋ผ๊ณ ์๊ฐํ๋ฉด, ๋ ํฌ์ธํฐ๋ ๊ฐ์ string ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์๋, ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ๊ฐ์ฒด์ ๋ ๋ฒ ํด์ ๋ฅผ ์๋ํ๊ธฐ ๋๋ฌธ์ ์๋๋ค. (ps๊ฐ ์๋ช ์ ๋คํ์ ๋ ํ๋ฒ, vocation์ด ์๋ช ์ด ๋คํ์ ๋ ํ๋ฒ)
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ๋ค์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋ณต์ฌ๋ฅผ ์ํํ๋๋ก ๋์ ์ฐ์ฐ์๋ฅผ ์ ์ํ๋ค. ๊ทธ๋ฌ๋ฉด ํ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ณต์ฌ๋ณธ์ด ๋๋ฏ๋ก, ๋ ํฌ์ธํฐ๋ ์๋ก ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์ง์ํ๊ฒ ๋๋ค.
- ํ๋์ ์ค๋งํธ ํฌ์ธํฐ๋ง์ด ํน์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋๋ก ์์ ๊ถ ๊ฐ๋ ์ ๋์ ํ๋ค. ์ค๋งํธ ํฌ์ธํฐ๊ฐ ๊ทธ ๊ฐ์ฒด๋ฅผ ์์ ํ๊ณ ์๋ ๊ฒฝ์ฐ์๋ง, ํ๊ดด์๊ฐ ๊ทธ ๊ฐ์ฒด๋ฅผ ์ญ์ ํ๋ค. ๊ทธ๋ฌ๊ณ ๋์, ๋์ ์ ํตํด ์์ ๊ถ์ ์ด์ ์ํจ๋ค. ์ด๊ฒ์ด auto_ptr, unique_ptr์์ ์ฌ์ฉํ๋ ์ ๋ต์ด๋ค.
- ํ๋์ ํน์ ํ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ค๋งํธ ํฌ์ธํฐ๋ค์ด ๋ช ๊ฐ์ธ์ง ์ถ์ ํ๋ ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์์ฑํ๋ค. ์ด๊ฒ์ ์ฐธ์กฐ ์นด์ดํ (reference counting)์ด๋ผ ํ๋ค. ๋์ ํ ๋๋ง๋ค ์ฐธ์กฐ ์นด์ดํ ์ด 1์ฉ ์ฆ๊ฐํ๋ค. ์ด๋ค ์ค๋งํธ ํฌ์ธํฐ์ ์๋ช ์ด ๋คํ ๋ ๋ง๋ค ์ฐธ์กฐ ์นด์ดํ ์ด 1์ฉ ๊ฐ์๋๋ค. ๋ฐ๋ผ์ ์ค๋งํธ ํฌ์ธํฐ์ ์๋ช ์ด ๋คํ์ ๋ delete๊ฐ ํธ์ถ๋๋ค. ์ด๊ฒ์ด shared_ptr ์ ๋ต์ด๋ค.
auto_ptr ๋ณด๋ค unique_ptr์ด ๋ ์ข์ ์ด์
์๋์ ๊ฐ์ ์ ์ธ์ด ์๋ค๊ณ ๊ฐ์ ํ์.
auto_ptr<string> p1(new string("auto")); //#1
auto_ptr<string> p2; //#2
p2=p1 //#3
#3์์ p2๊ฐ ๋ฌธ์์ด ๊ฐ์ฒด์ ๋ํ ์์ ๊ถ์ ์ธ์ํ์ ๋, p1์ ์์ ๊ถ์ ์์ด๋ฒ๋ฆฐ๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ p1์ด ๋ ์ด์ ์ ํจํ ๊ฐ์ ๊ฐ์ง๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ ํ๋ก๊ทธ๋จ์ด p1์ ์ฌ์ฉํ๋ ๋ฐ ์์ด์ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํจ๋ค.
unique_ptr์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
unique_prt<string> p3(new string("auto")); //#4
unique_ptr<string> p4; //#5
p4=p3; //#6
์ด ๊ฒฝ์ฐ, ์ปดํ์ผ๋ฌ๋ #6 ์ ์ธ์ ๋ํด ํ๋ฝ์ ํ์ง ์๋๋ค. ์ด๋ฐ ์ด์ ๋ก unique_ptr์ auto_ptr๋ณด๋ค ๋ ์์ ํ๋ค๊ณ ํ ์ ์๋ค. ๊ทธ๋ฌ๋, ํ๋์ ์ค๋งํธ ํฌ์ธํฐ์์ ๋ค๋ฅธ ์ค๋งํธ ํฌ์ธํฐ๋ก ๋์ ํ๋ ๊ณผ์ ์์ ํ์ด๋ฐ์ด ๋ง์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ๋ฐ๋ผ์, ๋ค์๊ณผ ๊ฐ์ ํจ์ ์ ์๋ฅผ ์ ์ํ๋ค.
unique_ptr<string> demo(const char *s)
{
unique_str<string> temp(new string(s));
return temp;
}
๊ทธ๋ฆฌ๊ณ , ๋ค์์ ์์ค์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
unique_ptr<string> ps;
ps=demo("Uniquely Special");
์ฌ๊ธฐ์, demo()๋ ์์ unique_ptr์ ๋ฆฌํดํ๋ค. ๊ทธ๋ฆฌ๊ณ ps๋ unique_ptr์ด ๋ฆฌํดํ ๊ฐ์ฒด์ ์์ ๊ถ์ ์ป๋๋ค. ๊ทธ๋ ๋ฆฌํด๋ unique_ptr์ ์ญ์ ๋๋ค.
c++์ unique_ptr์ ๋ค๋ฅธ unique_ptr๋ก ๋์ ํ ์ ์๋ std::move()๋ผ๋ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
using namespace std;
unique_ptr<string> ps1,ps2;
ps1 = demo("Uniquely special");
ps2 = move(ps1);
ps1 = demo(" and more");
cout<<*ps2<<*ps1<<endl;
๋ํ, unique_ptr์ array๋ก ์ฌ์ฉ๋ ์ ์๋ค๋ ์ฅ์ ๋ ๊ฐ์ง๊ณ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๋ฐ๋์ delete์ new, delete[]์ new[]๊ฐ ์์ผ๋ก ์ฌ์ฉ๋์ด์ผ ํ๋ค. auto_ptr์ delete๋ ์ฌ์ฉ ๊ฐ๋ฅ ํ์ง๋ง delete[]๋ ์ฌ์ฉ ๋ถ๊ฐ, ๋ง์ฐฌ๊ฐ์ง๋ก new๋ ์ฌ์ฉ ๊ฐ๋ฅํ์ง๋ง new[]์ ์ฌ์ฉ๋ถ๊ฐ.
std::unique_ptr<double[]> pda(new double(5));
//delete[]๋ฅผ ์ฌ์ฉํด์ผ ํจ
์ค๋งํธ ํฌ์ธํฐ ์ ํ
ํ๋ก๊ทธ๋จ์ด ํ๋์ ๊ฐ์ฒด์ ๋ํด ํ๋ ์ด์์ ํฌ์ธํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, shared_ptr์ ์ ํํด์ผ ํ๋ค. ํ๋ก๊ทธ๋จ์ด ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ์ํด ๋ค์ค ํฌ์ธํฐ๋ฅผ ํ์๋ก ํ์ง ์๋๋ค๋ฉด, unique_ptr์ ์ฌ์ฉํด์ผ ํ๋ค. new๋ก ๋์ ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฆฌํดํ๋ ํจ์์ ๋ฆฌํด ํ์ ์๋ ๊ฐ์ฅ ์ ์ ํ ์ ํ์ด๋ค.