首先,由于有不同类型的智能指针,我想将这个问题集中在其中的两个上:引用计数侵入式和非侵入式智能指针。对于每种指针类型,都会单独询问这个问题。
我真的不确定如何表达我的问题,所以我不是在问:我不是在问为什么,或者什么时候需要智能指针。我也不应该使用哪种类型的智能指针,也不应该使用什么。
这就是我要问的,我希望它足够清楚:当处理“智能管理”对象时,我应该在哪些上下文中使用哪种指针语义?也就是说,智能指针语义、原始指针语义、其他东西(例如对智能指针的引用)?
很明显,当我“存储”指向一个对象(对象是一个引用计数的内存实体)的指针时,比如一个全局指针,或者作为一个类成员,它应该是一个智能指针,所以它会声明所有权,但是其他情况呢?
当我将一个指针作为函数参数传递时,它应该是一个智能指针,一个原始指针,一个对智能指针的引用,或者其他什么?那么返回的指针呢?本地指针?所以..。
当然,我可以在任何地方使用智能指针,这是最安全的选择,但我觉得这真的没有必要,而且增加了开销。
发布于 2009-07-13 15:09:44
我的意思是,有时更快地做事情比有一个小的性能提高更好。如果你总是使用智能指针,我想你会做得更快。
我的建议是:到处使用智能指针。然后使用分析器查看它是否会产生相当大的开销。在需要的地方,更改它:)
发布于 2009-07-13 15:20:37
我建议你尽可能地限制指针的使用,不管是聪明的还是其他的。我不知道你的背景,但许多来自Java或C#等语言的人使用指针,而他们实际上应该使用值和引用调用。在C++程序中使用指针的情况应该相对较少。
发布于 2009-07-13 15:16:13
如果你试图对比“智能指针语义”和“原始指针语义”,你就错误地认为你可以将所有的“智能指针语义”组合在一起。我不同意。boost::scoped_ptr
和boost::shared_ptr
之间的差异与boost::shared_ptr
和T*
之间的差异具有相同的数量级
当您将指向对象的指针“存储”为类成员时,您实际上并没有说太多关于语义的内容。如果被引用的对象在逻辑上是一个成员(“拥有”),那么是的,你需要一个智能指针。但是有一个非常特殊的语义:单一所有权。这意味着没有共享所有权,也没有弱指针来命名另外两个常见的智能指针。另一方面,如果你存储一个指向错误日志对象的指针,你可能需要一个弱指针。这将防止您在关机期间崩溃-如果日志消失,弱指针将为NULL。
类似地,当你从一个函数返回一个指针时,case的实际语义将决定你需要的指针类型。而不是从函数返回的简单事实。
https://stackoverflow.com/questions/1119962
复制相似问题