cpp_shared_ptr - 8BitsCoding/RobotMentor GitHub Wiki

์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์ž๋™ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ์—๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

  1. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Java, C#)
  2. ์ฐธ์กฐ ์นด์šดํŒ…(Switf, Objective-C)

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

  • ๋ณดํ†ต ํŠธ๋ ˆ์ด์‹ฑ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜(Tracing Garbage Collection)์„ ์˜๋ฏธ
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ง‰์œผ๋ ค๋Š” ์‹œ๋„
  • ์ฃผ๊ธฐ์ ์œผ๋กœ ์ปฌ๋ ‰์…˜ ์‹คํ–‰
  • ์ถฉ๋ถ„ํ•œ ์—ฌ์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†์„ ๋•Œ ์ปฌ๋ ‰์…˜์ด ์‹คํ–‰๋จ
  • ๊ฐœ์ฒด๋ฅผ ๋ณ€์ˆ˜๋กœ ๊ฐ–๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ
  • ๋งค ์ฃผ๊ธฐ๋งˆ๋‹ค GC๋Š” ๋ฃจํŠธ(root)๋ฅผ ํ™•์ธํ•จ
    • ์ „์—ญ ๋ณ€์ˆ˜
    • ์Šคํƒ
    • ๋ ˆ์ง€์Šคํ„ฐ
  • ํž™์— ์žˆ๋Š” ๊ฐœ์ฒด์— ๋ฃจํŠธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํŒ๋‹จ
  • ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค๋ฉด, ๊ฐ€๋น„์ง€๋กœ ๊ฐ„์ฃผํ•ด์„œ ํ•ด์ œ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์˜ ๋ฌธ์ œ์ ?

  • ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฆ‰์‹œ ์ •๋ฆฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • GC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋™์•ˆ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ฉˆ์ถ”๊ฑฐ๋‚˜ ๋ฒ„๋ฒ…์ผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ์กฐ ์นด์šดํŒ…

  • ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ ์ฒ˜๋Ÿผ, ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๊ฐ€ ์—†์„ ๋•Œ ๊ฐœ์ฒด๊ฐ€ ํ•ด์ œ๋œ๋‹ค.

  • ์–ธ์ œ๋“  ์ฐธ์กฐ ํšŸ์ˆ˜๋ฅผ ํ™œ์šฉํ•ด์„œ ํŠน์ • ๊ฐœ์ฒด๊ฐ€ ๋ช‡ ๋ฒˆ์ด๋‚˜ ์ฐธ์กฐ๋˜๊ณ  ์žˆ๋Š”์ง€ ํŒ๋‹จ ๊ฐ€๋Šฅ

  • shared_ptr


๊ฐ•ํ•œ ์ฐธ์กฐ

  • ๊ฐ•ํ•œ ์ฐธ์กฐ๋ž€ ๊ฐœ์ฒด A๊ฐ€ ๊ฐœ์ฒด B๋ฅผ ์ฐธ์กฐํ•  ๋•Œ, ๊ฐœ์ฒด B๋Š” ์ ˆ๋Œ€ ์†Œ๋ฉธ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • ๊ฐ•ํ•œ ์ฐธ์กฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ•ํ•œ ์ฐธ์กฐ ์นด์šดํŠธ๋ฅผ ์‚ฌ์šฉ
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒˆ ์ธ์Šคํ„ด์Šค, ์ฆ‰ ๊ฐœ์ฒด์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ๋งŒ๋“ค ๋•Œ ๊ฐ€ํ•œ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚จ
  • ๊ฐ•ํ•œ ์ฐธ์กฐ ํšŸ์ˆ˜๊ฐ€ 0์ด ๋  ๋•Œ ํ•ด๋‹น ๊ฐœ์ฒด๋Š” ์†Œ๋ฉธ

์ฐธ์กฐ ์นด์šดํŒ…์˜ ๋ฌธ์ œ์ 

  • ์ฐธ์กฐ ํšŸ์ˆ˜๋Š” ๋„ˆ๋ฌด ์ž์ฃผ ๋ฐ”๋€œ
    • ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๋ ค๋ฉด lock, atomic์—ฐ์‚ฐ์ด ํ•„์š”
  • ์ˆœํ™˜ ์ฐธ์กฐ
    • A๊ฐ€ B๋ฅผ ์ฐธ์กฐ ํ›„ B๊ฐ€ A๋ฅผ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๋Š” ๊ฒฝ์šฐ

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜ vs ์ฐธ์กฐ ์นด์šดํŒ…

๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜

  • ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›€
  • ์‹ค์‹œ๊ฐ„ ๋˜๋Š” ๊ณ ์„ฑ๋Šฅ ํ”„๋กœ๊ทธ๋žจ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Œ

์ฐธ์กฐ ์นด์šดํŒ…

  • ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์›€
  • ์‹ค์‹œ๊ฐ„ ๋˜๋Š” ๊ณ ์„ฑ๋Šฅ ํ”„๋กœ๊ทธ๋žจ์— ์ ํ•ฉ
  • ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ ์ˆœ์ˆ˜ ํฌ์ธํ„ฐ๋ณด๋‹ค ํ›จ์”ฌ ๋А๋ฆผ

shared_ptr

#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๊ฐœ ์ค„์–ด๋“ ๋‹ค.

์ฐธ์กฐ ํšŸ์ˆ˜ ๊ตฌํ•ด์˜ค๊ธฐ(use_count())

#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

โš ๏ธ **GitHub.com Fallback** โš ๏ธ