将智能指针与容器配合使用的原因

问题描述 投票:2回答:3

简而言之,我想问“使用智能指针的一个好理由是什么?”例如[std::unique_ptr

但是,我没有问使用智能指针的原因在常规(哑)指针上。我认为每个人都知道,或者快速搜索就能找到原因。

我要问的是这两种情况的比较:

给名为MyObject的类(或结构)使用

  1. std:queue<std::unique_ptr<MyObject>>queue;

而不是

  1. std:queue<MyObject> queue;

(它可以是任何容器,不一定是队列)

为什么有人应该使用选项1而不是2?

c++ c++11 containers smart-pointers
3个回答
2
投票

这实际上是一个好问题。

我有几个原因可以想到:

  • 多态仅适用于引用和指针,不适用于值类型。因此,如果要将派生对象保存在容器中,则不能使用std::queue<MyObject>。一个选项是unique_ptr,另一个是reference_wrapper

  • 从容器外部引用包含的对象(*)。根据容器的不同,它保存的元素可以move,从而使以前对其的引用无效。例如std::vector::insert或容器本身的移动。在这种情况下,std::unique_ptr<MyObject>确保引用是有效的,无论容器如何处理(ofc,只要unique_ptr处于活动状态)。


(*)我在这里使用“ reference”及其英文含义,而不是C ++类型。引用对象的任何方式(例如,通过原始指针)


0
投票

第一个声明生成带有指针元素的容器,第二个声明生成纯对象。

这里是在对象上使用指针的一些好处:

  1. 它们允许您创建动态大小的数据结构。
  2. 它们使您可以直接操纵内存(例如打包或从硬件设备解压缩数据。)
  3. 它们允许对象引用(函数或数据对象)
  4. 它们允许您通过API操作对象,而无需了解对象的详细信息(API除外)。>>
  5. (原始)指针通常与CPU寄存器很好地匹配,这使得通过指针解引用值变得高效。 (C ++“智能”指针是更复杂的数据对象。)

  6. 而且,多态性被认为是面向对象编程的重要特征之一。在C ++中,多态主要分为两种类型:

  • 编译时多态性
  • 这种多态性是通过函数重载或运算符重载实现的。

  • 运行时多态性
  • 这种类型的多态性是通过函数重写实现的,如果我们要使用基类来使用这些函数,则必须使用指针而不是对象。

enter image description here


0
投票

用例:您想将某些内容存储在具有恒定索引的std::vector中,同时又能够从该向量中删除对象。

© www.soinside.com 2019 - 2024. All rights reserved.