cpp_shared_ptr - 8BitsCoding/RobotMentor GitHub Wiki
์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ (Java, C#)
- ์ฐธ์กฐ ์นด์ดํ (Switf, Objective-C)
- ๋ณดํต ํธ๋ ์ด์ฑ ๊ฐ๋น์ง ์ปฌ๋ ์ (Tracing Garbage Collection)์ ์๋ฏธ
- ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ง์ผ๋ ค๋ ์๋
- ์ฃผ๊ธฐ์ ์ผ๋ก ์ปฌ๋ ์ ์คํ
- ์ถฉ๋ถํ ์ฌ์ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์์ ๋ ์ปฌ๋ ์ ์ด ์คํ๋จ
- ๊ฐ์ฒด๋ฅผ ๋ณ์๋ก ๊ฐ๊ณ ์๋์ง ํ์ธ
- ๋งค ์ฃผ๊ธฐ๋ง๋ค GC๋ ๋ฃจํธ(root)๋ฅผ ํ์ธํจ
- ์ ์ญ ๋ณ์
- ์คํ
- ๋ ์ง์คํฐ
- ํ์ ์๋ ๊ฐ์ฒด์ ๋ฃจํธ๋ฅผ ํตํด ์ ๊ทผํ ์ ์๋์ง ํ๋จ
- ์ ๊ทผํ ์ ์๋ค๋ฉด, ๊ฐ๋น์ง๋ก ๊ฐ์ฃผํด์ ํด์
- ์ฌ์ฉ๋์ง ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฆ์ ์ ๋ฆฌํ์ง ์๋๋ค.
- GC๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์ผ ํ๋์ง ํ๋จํ๋ ๋์ ์ดํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๊ฑฐ๋ ๋ฒ๋ฒ ์ผ ์ ์๋ค.
-
๊ฐ๋น์ง ์ปฌ๋ ์ ์ฒ๋ผ, ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ ์์ ๋ ๊ฐ์ฒด๊ฐ ํด์ ๋๋ค.
-
์ธ์ ๋ ์ฐธ์กฐ ํ์๋ฅผ ํ์ฉํด์ ํน์ ๊ฐ์ฒด๊ฐ ๋ช ๋ฒ์ด๋ ์ฐธ์กฐ๋๊ณ ์๋์ง ํ๋จ ๊ฐ๋ฅ
-
shared_ptr
- ๊ฐํ ์ฐธ์กฐ๋ ๊ฐ์ฒด A๊ฐ ๊ฐ์ฒด B๋ฅผ ์ฐธ์กฐํ ๋, ๊ฐ์ฒด B๋ ์ ๋ ์๋ฉธ๋์ง ์๋๋ค.
- ๊ฐํ ์ฐธ์กฐ์ ์๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๊ฐํ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฌ์ฉ
- ์ผ๋ฐ์ ์ผ๋ก ์ ์ธ์คํด์ค, ์ฆ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ง๋ค ๋ ๊ฐํ ์ฐธ์กฐ ํ์๊ฐ ๋์ด๋จ
- ๊ฐํ ์ฐธ์กฐ ํ์๊ฐ 0์ด ๋ ๋ ํด๋น ๊ฐ์ฒด๋ ์๋ฉธ
- ์ฐธ์กฐ ํ์๋ ๋๋ฌด ์์ฃผ ๋ฐ๋
- ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์ ์์ ํ๋ ค๋ฉด lock, atomic์ฐ์ฐ์ด ํ์
- ์ํ ์ฐธ์กฐ
- A๊ฐ B๋ฅผ ์ฐธ์กฐ ํ B๊ฐ A๋ฅผ ๋ค์ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ
- ์ฌ์ฉํ๊ธฐ ์ฌ์
- ์ค์๊ฐ ๋๋ ๊ณ ์ฑ๋ฅ ํ๋ก๊ทธ๋จ์ ์ ํฉํ์ง ์์
- ์ฌ์ฉํ๊ธฐ ์ฌ์
- ์ค์๊ฐ ๋๋ ๊ณ ์ฑ๋ฅ ํ๋ก๊ทธ๋จ์ ์ ํฉ
- ๋ฉํฐ ์ค๋ ๋ฉ ํ๊ฒฝ์์ ์์ ํฌ์ธํฐ๋ณด๋ค ํจ์ฌ ๋๋ฆผ
#include <memory>
#include "Vector.h"
int main() {
std::stared_ptr<Vector> vector = std::make_shared<Vector>(10.f, 30.f);
// ...
}
- shared_ptr์ ๋ ๊ฐ์ ํฌ์ธํฐ๋ฅผ ์์
- ์์ ํฌ์ธํฐ๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- ์ ์ด ๋ธ๋ก์ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ
- ์ฐธ์กฐ ์นด์ดํ ๊ธฐ๋ฐ
- ์์ ํฌ์ธํฐ๋ ์ด๋ ํ shared_ptr์๊ฒ๋ ์ฐธ์กฐ๋์ง ์์ ๋ ์๋ฉธ๋๋ค.
std::shared_ptr<Vector> vector = std::make_shared<Vector>(10.f, 30.f);
std::shared_ptr<Vector> copiedVector = vector;
std::shared_ptr<Vector> vector = std::make_shared<Vector>(10.f, 30.f);
std::shared_ptr<Vector> copiedVector = vector;
vector.reset(); // nullptr
// strong ref๊ฐ 1๊ฐ ์ค์ด๋ ๋ค.
#include <memory>
#include "Vector.h"
int main() {
std::shared_ptr<Vector> vector = std::make_shared<Vector>(10.f, 30.f);
std::cout << "vector : " << vector.use_count() << std::endl;
std::shared_ptr<Vector> copiedVector = vector;
std::cout << "vector : " << vector.use_count() << std::endl;
std::cout << "copiedVector : " << copitedVector.use_count() << std::endl;
return 0;
}
class Person
{
public:
void SetPet(const std::shared_ptr<Pet>& pet);
// ...
private:
std::shared_ptr<Pet> mPet;
};
class Pet
{
public:
void SetOwner(const std::shared_ptr<Person>& owner);
// ...
private:
std::shared_ptr<Person> mOwner;
};
// main
std::shared_ptr<Person> owner = std::make_shared<Person>("Pope");
std::shared_prt<Pet> pet = std::make_shared<Pet>("Coco");
owner->SetPet(pet);
pet->SetOwner(owner);
์ํ ์ฐธ์กฐ๊ฐ ๋์ด ์ฃฝ์ง ์๋ ์ข๋น๊ฐ ๋๋ค.
std::weak_ptr