gpt4 book ai didi

c++ - 具有可选所有权的智能指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:07 24 4
gpt4 key购买 nike

我试图让一个类包含一个指针,它可以是一个拥有的指针或一个借用的指针。在前一种情况下,它应该销毁拥有的对象本身;在后一种情况下,它不应破坏指向的对象。

在代码中,我有类 A、B 和 C。我的目标是以下(简化的)定义,其中 B 是需要拥有指针的类:

class C {
...
};

class B {
C *c;
B(C *c) : c(c) {
}
};

class A {
C c1;
B b1, b2;
// b2 leaks pointer to C
A() : b1(&c1), b2(new C()) {
}
};

A 的实例销毁时,它会销毁 c1b1b2。理想情况下,b2 的销毁应该删除匿名 C 实例,但 b1 的销毁不应删除任何东西(因为 c1 会被 A 直接销毁)。

我可以使用什么样的智能指针来实现这一点?或者,最好的解决方案是将所有权标志传递给 B 吗?

最佳答案

如果您确定并且可以保证重用的 C 不会被提前销毁(三次检查),则有多种方法可以解决。
您可能会考虑一些:

  1. 您可以手动管理指针和标志。确保你获得了正确的复制语义,例如像这样:

    class B {
    std::unique_ptr<C> c;
    bool shared = false;

    B(C& c) : c(&c), shared(true) {}
    B(C *c = 0) : c(c) {}
    ~B() { if (shared) c.release(); }
    };
  2. 您可以使用自定义删除器,如下所示:

    template <class T> struct maybe_delete
    {
    void operator()(T* p) const noexcept {if(!shared) delete p;}
    bool shared = false;
    };
    template <class T> struct maybe_delete<T[]>
    {
    void operator()(T* p) const noexcept {if(!shared) delete [] p;}
    template <class U> void operator()(U*) const = delete;
    bool shared = false;
    };

    class B {
    std::unique_ptr<C, maybe_delete> c;

    B(C& c) : B(&c) {this->c.get_deleter().shared = true;}
    B(C *c) : c(c) {}
    };
  3. 您可以看一下 std::shared_ptr,尽管这可能是严重的矫枉过正,并且可能对您来说开销太大。

关于c++ - 具有可选所有权的智能指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24049590/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com