基本上我想从一个函数返回一个“指针”,但是要求用户把它保存在一个智能指针中.不仅如此,我不想授权一个特定的智能指针(共享与范围).
问题主要在于将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一起工作.
思考?
解决方法
由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 举报,一经查实,本站将立刻删除。