引用或shared_ptr作为关联成员

吉尼

我在写BarBar需要访问其他类Foo才有用。因此,Foo实例必须比使用它Bar实例长寿

我无法在两种编写方式之间做出选择。这是一个例子:

#include <iostream>
#include <memory> 
using namespace std; 

struct Foo {
    Foo(int _x) : x_(_x) {}
    ~Foo() {}
    int x_; 
}; 

struct Bar1 {  
    Bar1(Foo& _foo) : foo_(_foo) {}
    void print_foo() {cout << foo_.x_ << endl;}
private: 
    Foo& foo_; 
};

struct Bar2 {  
    Bar2(shared_ptr<Foo> _foo) : foo_{move(_foo)} {}
    void print_foo() {cout << foo_->x_ << std::endl;}
private:
    shared_ptr<Foo> foo_;
};

int main() 
{
    Foo f1{1}; 
    shared_ptr<Foo> f2 = make_shared<Foo>(2);
    Bar1 b1(f1); 
    b1.print_foo();
    Bar2 b2(f2); 
    b2.print_foo();
    return 0; 
}

我认为,Bar1为用户提供了更多关于如何管理Foo的生命的自由,并且它可能更有效。但它会在一个不确定的(不知道这是在这里正确的字)的状态,当实例foo_是指被破坏。

处理这种情况的首选方式是什么?为什么?

丹尼尔·加拉格尔(Daniel Gallagher)

我认为处理这种情况的首选方法取决于具体情况。正如您所确定的那样,Bar1在使用寿命内为用户提供了更大的自由度Foo,并且更加危险。它也效率更高(略),但可能不足以引起关注。

如果您知道一个事实(和/或可以证明)Foo将永远超过所有Bar对象(也许您Foo在堆栈中分配了要使用的对象main),那么使用没问题Bar1如果您不确定,那Bar2将是一条路。尽管语义可能是错误的Bar2(也许您不想Bar让自己Foo活着)。

这使我们想到了第三个选择:weak_ptr这将使用户可以控制的生存期Foo,但BarFoo销毁仍然允许具有已定义的行为

struct Bar3 {
    Bar3(std::weak_ptr<Foo> _foo) : foo_(_foo) {}
    void print_foo_v1() {
        // throws if foo_'s object has been destroyed
        std::shared_ptr<Foo> foo(foo_);
        std::cout << foo->x_ << std::endl;
    }
    void print_foo_v2() {
        // returns nullptr if foo_'s object has been destroyed
        std::shared_ptr<Foo> foo(foo_.lock());
        if (foo) {
            std::cout << foo->x_ << std::endl;
        }
    }
private:
    std::weak_ptr<Foo> foo_;
};

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

引用或shared_ptr作为关联成员

来自分类Dev

成员对象,引用和shared_ptr

来自分类Dev

将对具有 shared_ptr 作为值的映射的引用转换为对具有 shared_ptr 到 const 作为值的映射的引用

来自分类Dev

Lambda Capture shared_ptr成员

来自分类Dev

多态和shared_ptr成员

来自分类Dev

shared_ptr成员变量的多态分配

来自分类Dev

返回右值的 shared_ptr 成员

来自分类Dev

分配解引用的shared_ptr

来自分类Dev

取消引用从函数返回的shared_ptr

来自分类Dev

通过引用传递shared_ptr

来自分类Dev

shared_ptr增加父级引用

来自分类Dev

传递 std::shared_ptr 作为对 lambda 捕获列表的引用(C++)

来自分类Dev

您可以在同一对象中具有对成员std :: shared_ptr <variable>的成员引用吗?

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

使用* this作为std :: shared_ptr

来自分类Dev

通过推荐关联成员-Rails

来自分类Dev

shared_ptr的静态成员函数make_shared

来自分类Dev

返回本地unique_ptr作为shared_ptr

来自分类Dev

对创建的shared_ptr的boost :: make_shared引用

来自分类Dev

C ++入门5版。shared_ptr和关联容器

来自分类Dev

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

来自分类Dev

shared_ptr:在基类的shared_ptr中复制时,引用计数是否增加?

来自分类Dev

将const shared_ptr <T>&传递给shared_ptr <T>作为参数

来自分类Dev

返回shared_ptr <>的成员函数的const正确性

来自分类Dev

具有shared_ptr成员的C ++复制构造函数

来自分类Dev

将shared_ptr传递给std :: function(成员函数)

来自分类Dev

使用std :: shared_ptr和指向成员函数的指针

来自分类Dev

shared_ptr类的get()成员有什么用途?

来自分类Dev

Bison中的std :: shared_ptr导致成员错误

Related 相关文章

热门标签

归档