加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 返回需要由智能指针保持的“指针”

发布时间:2020-12-16 03:06:36 所属栏目:百科 来源:网络整理
导读:我有一个项目,我想更多地使用智能指针.总的来说,我已经在这个目标上取得了成功.不过,我遇到了一件我不知道“最佳实践”的东西. 基本上我想从一个函数返回一个“指针”,但是要求用户把它保存在一个智能指针中.不仅如此,我不想授权一个特定的智能指针(共享与范
我有一个项目,我想更多地使用智能指针.总的来说,我已经在这个目标上取得了成功.不过,我遇到了一件我不知道“最佳实践”的东西.

基本上我想从一个函数返回一个“指针”,但是要求用户把它保存在一个智能指针中.不仅如此,我不想授权一个特定的智能指针(共享与范围).

问题主要在于将scoped_ptr升级到shared_ptr似乎并不合适(这将是我认为的理想解决方案).我明白为什么他们没有这样做,因为它将允许转让所有权,这可能导致一些问题,如std :: auto_ptr有.

然而,转让所有权似乎是一个好主意.所以我的想法是这样的:

// contrived example of factory pattern
std::auto_ptr<A> func() { return std::auto_ptr<A>(new A); }

这样做可以“ok”,因为scoped_ptr和shared_ptr都具有从std :: auto_ptr获取所有权的构造函数.

所以我的问题是,这个好习惯吗?有更好的解决方案吗?我唯一能够提出的真正替代方法是使用模板模板作为返回值,如下所示:

// similar to above example
template <template <typename> class P>
P<A> func() { return P<A>(new A); }

这实际上可以很好地工作,除了我认为需要一些工作来使它与scoped_ptr一起工作.

思考?

解决方法

使用std :: auto_ptr是好的做法,实际上建议使用 such example
由Bjarne Stroustrup.

auto_ptr的移动语义为您提供了正确的工具来处理它.

例如:

auto_ptr<Foo> make_foo()
{
    return auto_ptr<Foo>(new Foo);
}

Foo *raw_pointer=make_foo().release();
shared_ptr<Foo> shared_pointer=make_foo();
auto_ptr<Foo> auto_pointer=make_foo();

如果你返回shared_ptr你不能回退到正常的指针,用auto_ptr可以.您可以将auto_ptr升级到共享但不是其他方向.

另一个重要的一点是,shared_ptr使用原子引用计数,这要慢得多
auto_ptr所做的简单而又全面的工作.

P.S:scoped_ptr只是auto_ptr for poors的版本 – 它是不可复制的没有默认的constuctor.它更像是“不太混淆”的auto_ptr版本,与shared_ptr相比,它不在tr1中.一般使用没有太多的优点scoped_ptr超过auto_ptr

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读