C++ ํ๋ก๊ทธ๋จ์์ new ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ์ผ๋ก ํ ๋น ๋ฐ์ ๋ฉ๋ชจ๋ฆฌ๋, ๋ฐ๋์ delete ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํด์ ํด์ผ ํฉ๋๋ค. C++์์๋ ๋ฉ๋ชจ๋ฆฌ ๋์ (memory leak)์ผ๋ก๋ถํฐ ํ๋ก๊ทธ๋จ์ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ค๋งํธ ํฌ์ธํฐ๋ฅผ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ์ค๋งํธ ํฌ์ธํฐ(smart pointer)๋ ํฌ์ธํฐ์ฒ๋ผ ๋์ํ๋ ํด๋์ค ํ ํ๋ฆฟ์ผ๋ก, ์ฌ์ฉ์ด ๋๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํด ์ค๋๋ค.
์ค๋งํธ ํฌ์ธํฐ์ ๋์
๋ณดํต new ํค์๋๋ฅผ ์ฌ์ฉํด ๊ธฐ๋ณธ ํฌ์ธํฐ๊ฐ ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์ด๊ธฐํํ ํ์, ๊ธฐ๋ณธ ํฌ์ธํฐ๋ฅผ ์ค๋งํธ ํฌ์ธํฐ์ ๋์ ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
์ด๋ ๊ฒ ์ ์๋ ์ค๋งํธ ํฌ์ธํฐ์ ์๋ช ์ด ๋คํ๋ฉด ์๋ฉธ์๋, deleteํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํฉ๋๋ค.
๋ฐ๋ผ์ new ํค์๋๊ฐ ๋ฐํ๋๋ ์ฃผ์๊ฐ์ ์ค๋งํธ ํฌ์ธํฐ์ ๋์ ํ๋ฉด, ๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ํ์๊ฐ ์์ด์ง๋๋ค.
์ค๋งํธ ํฌ์ธํฐ์ ์ข ๋ฅ
1. unique_ptr
2. shared_ptr
3. weak_ptr
unique_ptr
unique_ptr์ ํ๋์ ์ค๋งํธ ํฌ์ธํฐ๋ง์ด ํน์ ๊ฐ์ฒด๋ฅผ ์์ ํ ์ ์๋๋ก, ๊ฐ์ฒด์ ์์ ๊ถ ๊ฐ๋ ์ ๋์ ํ ์ค๋งํธ ํฌ์ธํฐ ์ ๋๋ค.
์ด ์ค๋งํธ ํฌ์ธํฐ๋ ํด๋น ๊ฐ์ฒด์ ์์ ๊ถ์ ๊ฐ์ง๊ณ ์์ ๋๋ง, ์๋ฉธ์๊ฐ ํด๋น ๊ฐ์ฒด๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
unique_ptr ์ธ์คํด์ค๋ move() ๋ฉค๋ฒ ํจ์๋ฅผ ํตํด ์์ ๊ถ์ ์ด์ ํ ์๋ ์์ง๋ง, ๋ณต์ฌ ํ ์๋ ์์ต๋๋ค.
์์ ๊ถ์ด ์ด์ ๋๋ฉด, ์ด์ unique_ptr ์ธ์คํด์ค๋ ํด๋น ๊ฐ์ฒด๋ฅผ ์์ ํ์ง ์๊ฒ ์ฌ์ค์ ๋ฉ๋๋ค.
unique_ptr<int> ptr01(new int(5)); // intํ unique_ptr์ธ ptr01์ ์ ์ธํ๊ณ ์ด๊ธฐํํจ.
auto ptr02 = move(ptr01); // ptr01์์ ptr02๋ก ์์ ๊ถ์ ์ด์ ํจ.
// unique_ptr<int> ptr03 = ptr01; // ๋์
์ฐ์ฐ์๋ฅผ ์ด์ฉํ ๋ณต์ฌ๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํด.
ptr02.reset(); // ptr02๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ญ์ ํจ.
ptr01.reset(); // ptr01๊ฐ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ญ์ ํจ.
c++ 14์ดํ ๋ถํฐ ์ ๊ณต๋๋ make_unique()ํจ์๋ฅผ ์ฌ์ฉ ํ๋ฉด unique_ptr์ธ์คํด์ค๋ฅผ ์์ ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
make_unique()ํจ์๋ ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํด ์ง์ ๋ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ unique_ptr์ ๋ฐํํฉ๋๋ค.
.
#include <iostream>
#include <memory>
using namespace std;
class Person
{
private:
string name_;
int age_;
public:
Person(const string& name, int age); // ๊ธฐ์ด ํด๋์ค ์์ฑ์์ ์ ์ธ
~Person() { cout << "์๋ฉธ์๊ฐ ํธ์ถ๋์์ต๋๋ค." << endl; }
void ShowPersonInfo();
};
int main(void)
{
unique_ptr<Person> hong = make_unique<Person>("๊ธธ๋", 29);
hong->ShowPersonInfo();
return 0;
}
Person::Person(const string& name, int age) // ๊ธฐ์ด ํด๋์ค ์์ฑ์์ ์ ์
{
name_ = name;
age_ = age;
cout << "์์ฑ์๊ฐ ํธ์ถ๋์์ต๋๋ค." << endl;
}
void Person::ShowPersonInfo() { cout << name_ << "์ ๋์ด๋ " << age_ << "์ด์
๋๋ค." << endl; }
์์ ์์ ์์ person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฅดํค๋ unique_ptr ์ธ์คํด์ค์ธ hong์ ์ผ๋ฐ ํฌ์ธํฐ์ ๋ฌ๋ฆฌ ์ฌ์ฉ์ด ๋๋ ํ์ delete ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ํ์๊ฐ ์์ต๋๋ค.
shared_ptr
shared_ptr์ ํ๋์ ํน์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๋ ์ค๋งํธ ํฌ์ธํฐ๊ฐ ์ด ๋ช๊ฐ์ธ์ง๋ฅผ ์ฐธ์กฐํ๋ ์ค๋งํธ ํฌ์ธํฐ ์ ๋๋ค.
์ด๋ ๊ฒ ์ฐธ์กฐํ๊ณ ์๋ ์ค๋งํธ ํฌ์ธํฐ์ ๊ฐ์๋ฅผ ์ฐธ์กฐ ํ์(reference count)๋ผ๊ณ ํฉ๋๋ค.
์ฐธ์กฐ ํ์๋ ํน์ ๊ฐ์ฒด์ ์๋ก์ด shared_ptr์ด ์ถ๊ฐ ๋ ๋๋ง๋ค 1์ฉ ์ฆ๊ฐํ๋ฉฐ, ์๋ช ์ด ๋คํ ๋๋ง๋ค 1์ฉ ๊ฐ์ํฉ๋๋ค.
๋ฐ๋ผ์ ๋ง์ง๋ง shared_ptr์ ์๋ช ์ด ๋คํ์ฌ, ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋๋ฉด delete ํค์๋๋ฅผ ์ฌ์ฉํ๋ฉฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ํด์ ํฉ๋๋ค.
shared_ptr<int> ptr01(new int(5)); // intํ shared_ptr์ธ ptr01์ ์ ์ธํ๊ณ ์ด๊ธฐํํจ.
cout << ptr01.use_count() << endl; // 1
auto ptr02(ptr01); // ๋ณต์ฌ ์์ฑ์๋ฅผ ์ด์ฉํ ์ด๊ธฐํ
cout << ptr01.use_count() << endl; // 2
auto ptr03 = ptr01; // ๋์
์ ํตํ ์ด๊ธฐํ
cout << ptr01.use_count() << endl; // 3
์์ ์์ ์์ ์ฌ์ฉ๋ use_count() ๋ฉค๋ฒ ํจ์๋ shared_ptr ๊ฐ์ฒด๊ฐ ํ์ฌ ๊ฐ๋ฆฌํค๊ณ ์๋ ๋ฆฌ์์ค๋ฅผ ์ฐธ์กฐ ์ค์ธ ์์ ์์ ์๋ฅผ ๋ฐํํด ์ค๋๋ค.
์์ ๊ฐ์ ๋ฐฉ๋ฒ ์ด์ธ์๋ make_shared() ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด shared_ptr ์ธ์คํด์ค๋ฅผ ์์ ํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
make_shared() ํจ์๋ ์ ๋ฌ๋ฐ์ ์ธ์๋ฅผ ์ฌ์ฉํด ์ง์ ๋ ํ์ ์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ , ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ shared_ptr์ ๋ฐํํฉ๋๋ค.
์ด ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด, ์์ธ ๋ฐ์์ ๋ํด ์์ ํ๊ฒ ๋์ฒํ ์ ์์ต๋๋ค.
๋ค์ ์์ ๋ Person ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ hong์ด๋ผ๋ shared_ptr๋ฅผ make_shared() ํจ์๋ฅผ ํตํด ์์ฑํ๋ ์์ ์ ๋๋ค.
shared_ptr<Person> hong = make_shared<Person>("๊ธธ๋", 29);
cout << "ํ์ฌ ์์ ์ ์ : " << hong.use_count() << endl; // 1
auto han = hong;
cout << "ํ์ฌ ์์ ์ ์ : " << hong.use_count() << endl; // 2
han.reset(); // shared_ptr์ธ han์ ํด์ ํจ.
cout << "ํ์ฌ ์์ ์ ์ : " << hong.use_count() << endl; // 1
weak_ptr
weak_ptr์ ํ๋ ์ด์์ shared_ptr ์ธ์คํด์ค๊ฐ ์์ ํ๋ ๊ฐ์ฒด์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ์ง๋ง, ์์ ์์ ์์๋ ํฌํจ๋์ง ์๋ ์ค๋งํธ ํฌ์ธํฐ์ ๋๋ค.
shared_ptr์ ์ฐธ์กฐ ํ์(reference count)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ ์ค๋งํธ ํฌ์ธํฐ์ ๋๋ค.
๋ง์ฝ ์๋ก๊ฐ ์๋๋ฐฉ์ ๊ฐ๋ฆฌํค๋ shared_ptr๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ์ฐธ์กฐ ํ์๋ ์ ๋ 0์ด ๋์ง ์์ผ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ ์์ํ ํด์ ๋์ง ์์ต๋๋ค.
์ด๋ ๊ฒ ์๋ก๊ฐ ์๋๋ฐฉ์ ์ฐธ์กฐํ๊ณ ์๋ ์ํฉ์ ์ํ ์ฐธ์กฐ(circular reference)๋ผ๊ณ ํฉ๋๋ค.
weak_ptr์ ๋ฐ๋ก ์ด๋ฌํ shared_ptr ์ธ์คํด์ค ์ฌ์ด์ ์ํ ์ฐธ์กฐ๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด์ ์ฌ์ฉ๋ฉ๋๋ค.
'๐ Development Study > ๐จ๐พโ๐ป C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํ์ผ ์ ์ถ๋ ฅ (1) | 2022.08.22 |
---|---|
์ ์ฒ๋ฆฌ๊ธฐ #define (1) | 2022.08.22 |
exception (0) | 2022.08.22 |
ํ๋ณํ (0) | 2022.08.22 |
๋คํ์ฑ (0) | 2022.08.22 |
๋๊ธ