我有一个项目,我想更多地使用智能指针.总的来说,我已经在这个目标上取得了成功.不过,我遇到了一件我不知道“最佳实践”的东西.
基本上我想从一个函数返回一个“指针”,但是要求用户把它保存在一个智能指针中.不仅如此,我不想授权一个特定的智能指针(共享与范围).
问题主要在于将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.
由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