cpp_week_ptr - 8BitsCoding/RobotMentor GitHub Wiki

์ˆœํ™˜์ฐธ์กฐ์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž.


์•ฝํ•œ(weak) ์ฐธ์กฐ

  • ์•ฝํ•œ ์ฐธ์กฐ๋Š” ์›์‹œ ํฌ์ธํ„ฐ ํ•ด์ œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.
  • ์•ฝํ•œ ์ฐธ์กฐ ์นด์šดํŠธ๋Š” ์•ฝํ•œ ์ฐธ์กฐ์˜ ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
  • ์•ฝํ•œ ์ฐธ์กฐ๋กœ ์ฐธ์กฐ๋˜๋Š” ๊ฐœ์ฒด๋Š” ๊ฐ•ํ•œ ์ฐธ์กฐ ์นด์šดํŠธ๊ฐ€ 0์ด ๋  ๋•Œ ์†Œ๋ฉธ๋œ๋‹ค.
  • ์ˆœํ™˜ ์ฐธ์กฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ!

Example

#include <memory>
#include "Person.h"

int main() {
    std::shared_ptr<Person> owner = std::make_shared<Person>("Pope");
    std::weak_ptr<Person> weakOwner = owner;

    // strong ref 1, weak ref 1์ด ๋œ๋‹ค.

    return 0;
}

์•ฝํ•œ ํฌ์ธํ„ฐ ์‚ฌ์šฉํ•˜๊ธฐ

#include <memory>
#include "Person.h"

int main() {
    std::shared_ptr<Person> owner = std::make_shared<Person>("Pope");
    std::weak_ptr<Person> weakOwner = owner;

    std::shared_ptr<Person> lockedOwner = weakOwer.lock();
    // ์‚ฌ์šฉ์‹œ์—๋Š” shared_ptr๋กœ ์‚ฌ์šฉํ•ด์•ผํ•˜๊ณ  lockํ•จ์ˆ˜๋ฅผ ์จ์„œ share_ptr๋กœ ์ „๋‹ฌ

    return 0;
}

์ด๋ ‡๊ฒŒ ์“ฐ๋Š” ์ด์œ ๋Š” ๋ฉ€ํ‹ฐ ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์—์„œ weak_ptr๋กœ ์“ฐ๋Š” ์ค‘์— ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—์„œ ํ•ด๋‹น ํฌ์ธํ„ฐ๋ฅผ ์ง€์›Œ๋ฒ„๋ฆด๊นŒ๋ด ์•ˆ์ „์žฅ์น˜๋ฅผ ๋‘๋Š” ๊ฒƒ


๊ณต์œ  ํฌ์ธํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ 1

#include <memory>
#include "Person.h"

int main() {
    std::shared_ptr<Person> owner = std::make_shared<Person>("Pope");
    std::weak_ptr<Person> weakOwner = owner;

    auto ptr = weakOwner.lock();

    if(ptr == nullptr)
    {
        // ์ด๋ฏธ ์ง€์›Œ์กŒ์œผ๋ฉด ์—ฌ๊ธฐ๋กœ ๋“ค์˜ค๊ฒ ์ง€?
    }
}

๊ณต์œ  ํฌ์ธํ„ฐ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธ 2

#include <memory>
#include "Person.h"

int main() {
    std::shared_ptr<Person> owner = std::make_shared<Person>("Pope");
    std::weak_ptr<Person> weakOwner = owner;

    if(weakOwner.expired())     // false
#include <memory>
#include "Person.h"

int main() {
    std::shared_ptr<Person> owner = std::make_shared<Person>("Pope");
    std::weak_ptr<Person> weakOwner = owner;

    owner = nullptr;

    if(weakOwner.expired())     // true

์•ฝํ•œ ํฌ์ธํ„ฐ๋กœ ์ˆœํ˜ธ๋‚˜ ์ฐธ์กฐ๋ฅผ ํ•ด๊ฒฐํ•ด๋ณด์ž

// ๋‘˜ ์ค‘ ํ•˜๋‚˜๋Š” ์•ฝํ•œ์ฐธ์กฐ๋ฅผ ๊ฐ–์ž
class Pet
{
public:
    void SetPet(const std::shared_ptr<Pet>& pet);
    // ...
private:
    std::shared_ptr<Pet> mPet;
}
class Person
{
public:
    void SetOwner(const std::shared_ptr<Person>& owner);
    // ...
private:
    std::weak_ptr<Person> mOwner;
}
โš ๏ธ **GitHub.com Fallback** โš ๏ธ