微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有一个项目,我想更多地使用智能指针.总的来说,我已经在这个目标上取得了成功.不过,我遇到了一件我不知道“最佳实践”的东西.

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

问题主要在于将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

原文地址:https://www.jb51.cc/c/112524.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐