为什么要在C ++中将智能指针作为函数参数传递?

时间:2012-10-01 20:24:46

标签: c++ function pointers smart-pointers

我对C ++智能指针很陌生,我很难理解这个关于将它们用于函数参数的建议。

“C ++编码标准:101规则,指南和最佳实践”说这些是传递智能指针的原因。

  

首选(智能)指针

     
      
  • 如果参数是可选的(因此调用者可以将null作为“不可用”或“不关心”值传递)
  •   
  • 或者如果函数存储指针的副本
  •   
  • 或以其他方式操纵论证的所有权。
  •   

有人可以给我一些他们每个人的例子,为什么不使用智能指针在这些情况下是个坏主意?

4 个答案:

答案 0 :(得分:7)

  

首选(智能)指针 [当......]

我认为你误读了编码标准。您将其读作“这些是使用智能指针的原因”。作者的意图是“这些是使用某种指针的原因,这可能是一个智能指针。”

答案 1 :(得分:4)

  

首选(智能)指针

请注意括号中的“智能”是什么?

这里的人在谈论的是通过指针与参考。智能存在于括号中,因为当您在喜欢智能指针的团队中工作时,您会遵循类似的规则。

答案 2 :(得分:2)

我将假设这个问题与指针有关,因为这就是问题中引用的文字正在解释的内容。

为什么你想要使用智能指针(或一般的老式指针)有几个原因。第一个也是最明显的一个是当你通过引用或指针传递某些东西时,你将指针传递给内存中的项目,这意味着你得到的是实际的对象而不是副本,就像你在传递值时得到的那样。当你想使用某个函数操作一个对象时,这很有用,或者只是为了减少复制(想象一直将一个大文本文件作为一个值发送,这肯定会效率低下!)

接下来,将一些东西作为空值传递的机会。这基本上意味着参数可以作为“不存在”传递,而“不存在”又可以在逻辑中处理。例如,如果文件指针为null,则创建一个新文件。

具体来说,对于智能指针:智能指针是在幕后有额外管理算法的指针,可以是引用计数或其他选项。例如,您可以使用unique_pointer来确保在任何给定时间只存在一个指向该对象的指针。有关更多信息,请参阅维基百科http://en.wikipedia.org/wiki/Smart_pointer

如果确实问题与一般指针的运作有关,请参阅此简介http://www.tech-recipes.com/rx/1232/c-pointers-pass-by-value-pass-by-reference/

答案 3 :(得分:1)

智能指针存在于一个功能中,只有一个功能:

  

论证的所有权

智能指针强制执行此操作,以便您不会将其启动,这很可能是因为手动管理所有权非常容易出错,而智能指针可以保证。

在常规指针上使用智能指针没有其他理由。