2012-07-25 58 views
1

函数需要返回指向StructAshared_ptr什么是一个好的返回类型`boost :: shared_ptr <StructA>`?

struct StructA 
{ 
    // complicated struct that also holds other sub-structure 
    .... 
}; 

const boost::shared_ptr<const StructA&>& GetStructA(...) 
{...} #0.5 

const boost::shared_ptr<const StructA>& GetStructA(...) 
{...} #0 

const boost::shared_ptr<StructA>& GetStructA(...) 
{...} #1 

const boost::shared_ptr<StructA> GetStructA(...) 
{...} #2 

boost::shared_ptr<const StructA> 
{...} #3 

boost::shared_ptr<StructA> GetStructA(...) 
{...} #4 

boost::shared_ptr<StructA>& GetStructA(...) 
{...} #5 

boost::shared_ptr<StructA&> GetStructA(...) 
{...} #6 

有这么多的选择,我相信他们中的一个是最好的(请指出,如果还有人左)。

就个人而言,我更喜欢使用#0

const boost::shared_ptr<const StructA&>& GetStructA(...) 
{...} #0 

遗留系统使用#2

const boost::shared_ptr<StructA> GetStructA(...) 
{...} #2 

为什么我宁愿选择#0是如下原因:

  1. 返回常量shared_ptr的,使得该函数的调用者不应改变返回的shared_ptr其可以指向内部数据结构

  2. 返回通过引用,这样我可以避免+/-的shared_ptr的引用计数的

  3. shared_ptr保存const StructA &,以便调用方不能更改const shared_ptr的内容。如果我是对的,即使shared_ptr是const,它也不能阻止调用者改变指向的数据,除非数据是const。

  1. 纠正我的理解,如果我没有犯错
  2. 提供此功能的最好回报签名。

谢谢

+0

你不想让他做shared_ptr'X =其他值'或者你不想'(* X)=其他值'? – RedX 2012-07-25 15:26:12

+2

2>这是*非常危险*,通过颠覆共享指针的整个目的。你现在有一个指针,认为它被使用了3次,但是真的被使用了6,并且在3次发布(segfault)后使用时不会抛出。它也可能尝试自我释放6次,因为示波器在每个参考上都会关闭。 – ssube 2012-07-25 15:28:06

+4

我甚至没有意识到它是合法的*使共享指针包含引用类型... Eeevil – jalf 2012-07-25 15:33:30

回答

2

这将取决于函数的功能:

  • 是它创造StructA的新对象?如果是,那么你必须返回一个shared_ptr的副本。
  • 它只是提供对StructA对象的访问,您知道它不会在返回的引用下过期吗?然后,你可以在它返回常量&(但不 - 见下文)

正如你犯罪嫌疑人,对的shared_ptr不会阻止对象非const访问常量&它指向 - 它只是手段该shared_ptr对象本身是常量,不能被重置或指向其他对象。在这种情况下,shared_ptr的语义与普通指针的语义相同。

我在返回访问指针时习惯使用const &。但最后它会导致非常微妙的错误,特别是在多线程代码中(我很小心,但我仍然被咬伤)。所以上面的peachykeen的评论是很重要的,我遵循那个所有新代码的习惯用法。不仅仅是为了让你回想起你,而且当函数参数是一个shared_ptr时。在最后你真的想知道,只要你有一个由shared_ptr指向的对象 - 你真的有它,而不仅仅是一个长期死对象的shared_ptr的引用。

相关问题