C++ 智能指针(唯一指针)是否总是优于普通指针?

C++ 智能指针(唯一指针)是否总是优于普通指针?,c++,C++,智能指针在超出范围时会自动取消分配并删除。 是否存在这样的情况,即当我们仍然希望它可用时,智能/唯一指针被删除 换句话说,我们应该在什么时候使用哪个指针,或者我们可以始终使用唯一指针?您将智能指针与唯一指针混为一谈。当需要共享\u ptr样式的管理时,显然唯一的\u ptr将不起作用,因此您不能说它总是比普通指针更可取。一个普通的指针至少允许共享访问,尽管管理共享访问会更加困难。假设预期的问题是真的 “是否存在普通指针优于唯一指针的情况 如所示,答案是明确的是 std::unique_ptr具有

智能指针在超出范围时会自动取消分配并删除。 是否存在这样的情况,即当我们仍然希望它可用时,智能/唯一指针被删除


换句话说,我们应该在什么时候使用哪个指针,或者我们可以始终使用唯一指针?

您将智能指针与唯一指针混为一谈。当需要共享\u ptr样式的管理时,显然唯一的\u ptr将不起作用,因此您不能说它总是比普通指针更可取。一个普通的指针至少允许共享访问,尽管管理共享访问会更加困难。

假设预期的问题是真的

“是否存在普通指针优于唯一指针的情况

如所示,答案是明确的是

std::unique_ptr具有对象的唯一所有权

如果您不想拥有所有权,而只想观察和访问对象,则需要一个原始指针——或功能等效的抽象——来避免参与自动破坏行为


这些是对象指针最常用的用法。输出字符串文字时,您已经在使用这样的指针,即指向字符数组第一项的指针。声明main的参数,您就又有了这样一个指针。他们几乎无处不在。操作词可能是“无处不在的”,很常见,人们根本没有注意到。

< P>一个重要的C++编程原理,它实现了资源自动清理的重要属性。这对于C++代码异常安全尤为重要。您不太可能忘记清理,并且您编写的C++代码是否与C++实际使用C++异常是相同的。 < P>智能指针是在C++中实现RAII的一种方法。 C++11标准std::unique_ptr用于仅由单个实体拥有的东西。当那个实体被摧毁时,它所拥有的东西应该立即被清理

std::shared_ptr用于在多个实体之间拥有共享所有权的东西,它实际应该被删除的唯一时间是当对它的所有引用都消失时。特别是在这里,你实际上不知道哪一个实体将是“最后一个站立的实体”

对于Microsoft平台,在使用COM对象时,应使用Microsoft::WRL::ComPtr。对于使用C++/CX语言扩展的WinRT编程,T^是相同的

所有此类引用均为“强”引用,具有所有权保证。您还可以对同一资源进行“弱”引用,在std::unique_ptr或Microsoft::WRL::ComPtr的情况下,它只是一个原始指针。弱引用允许您引用对象,但不声明该对象的所有权状态

因此,原始指针非常适合作为参数传递给函数,这些参数将按顺序执行,而不是异步地调用遗留函数,等等。只要你保证当有人对同一事物使用弱引用时,“强拥有”对象不会被破坏,它们都可以完美地工作

实际上,这意味着您可能希望在类私有数据成员中使用智能指针来保存您创建的资源,并希望在类的生命周期中存在,但是您可以并且应该将原始指针用作只需要临时使用资源的函数的弱引用

当然,您可以将智能指针作为参数传递,但您希望作为const ref传递:

void function(const std::unique_ptr<T>& data);
现在,如果您实际上要返回一个新对象或获取所有权,那么使用以下内容会更有意义:

std::unique_ptr<T> function();

void function(std::unique_ptr<T>& data);

请参阅,和。

我不认为其中一个适合所有要求。这个问题似乎过于宽泛,因为我设想详细地写至少一本关于这些主题的胖书。这是个不好的问题。你能把它缩减到更有限的范围吗?共享的ptr不会自动取消分配。这个问题已经讨论过几百次了。就个人而言,我不认为C++社区作为一个整体已经达到了最终结论。这些特点是相当新的;我们缺乏使用它们的经验,尤其是在代码库必须维护几十年的大型项目中。普通指针至少允许共享访问这是我在回答中一直试图解释的。@YassineHoussni您的问题没有讨论共享访问,因为数组中每个对象只有一个指针。您可以使用一个惟一的_ptr数组,代码仍然可以工作。事实上,这是最好的。是的,我现在明白了,我缺乏C++知识和我对C的过度知识使我想到了这个答案。谢谢你帮我澄清。WRL不仅仅是一个商店应用程序吗?在旧时代,我们使用基于ATL的WTL来进行DekStand程序。WRL是一个C++模板库,一个 你可以在任何C++程序中使用微软::WRL:COMPTR。它比ATL的CComPtr好,因为ATL不在Express版本中,b它对REDIST DLL没有任何依赖关系。WRL的其余部分用于处理WinRT API,其中一些实际上用于Win32桌面应用程序。。。
std::unique_ptr<T> function();

void function(std::unique_ptr<T>& data);