【问题标题】:c++: copy, delete and operator = in map of raw pointersc ++:原始指针映射中的复制,删除和运算符=
【发布时间】:2019-11-20 13:23:45
【问题描述】:

我有一个关于智能指针和原始指针的问题。

我的第一个想法是使用原始指针:所以如果在一个类(例如类 Routes)中它的属性是 map<string, list<Route *>> _mapIATAmap<int, list<Route*>> _mapID,我将不得不在类中实现一个销毁器、一个副本和一个 operator=方法,我错了吗?

但是,如果我不使用原始指针,而是使用智能指针,我就不必担心删除指向的内容,但是复制和分配呢?

目前,我不确定什么会更好;原始或智能指针。

谢谢!

【问题讨论】:

  • std::unique_ptr 的开销可能比原始指针少。使用节点的就地构造可能可以防止复制和分配,例如std::list<T,Allocator>::emplace_back.
  • 关于某物列表的地图,std::multi_map 也可能是一个替代方案。
  • 我确实考虑过使用 multi_map,但为了程序的目的,最好使用地图和列表。
  • 你写的地方我可能会复制相同的路线20次......。这是否意味着Route 的同一个实例可以出现在多个map 条目中,甚至可能在一个列表中出现多次?在这种情况下,我更喜欢std::shared_ptr(无论其额外费用如何)。在我开始使用智能指针之前,我曾与太多不稳定的应用程序作斗争。另一个解决方案(我之前尝试过)可能是一个全局向量(或映射),用于存储所有 Routes 和索引引用(而不是原始指针),至少允许检测丢失的实例......

标签: c++ dictionary pointers copy smart-pointers


【解决方案1】:

我正在处理大量数据,这就是我考虑使用原始指针的原因,...

这是一个错误的前提。 std::list 确实在内部使用动态内存。通过添加另一层间接,您将一无所获。当你想指向某物时使用指针。如果你想要对象使用对象。

但是,如果我不使用原始指针,而是使用智能指针,我就不必担心删除指向的内容,但是复制和分配呢?

无论是否使用指针,您都必须确保正确实现了rule of 0/3/5

我不确定什么会更好;原始或智能指针。

两者都没有。使用map<string, list<Route>>,除非您需要在多个所有者之间共享Routes(如果您不知道这意味着什么,那么可能不需要)。

PS:如果您担心性能,可能值得尝试std::vector 而不是std::list

【讨论】:

  • 我必须使用指针,我知道这一点。是的,我知道我总是必须实现一个析构函数、一个副本和一个赋值运算符......我的问题更多基于如果我使用智能指针,我应该实现一个副本和 operator = 方法吗?我几乎没有和他们一起工作过,这就是我问的原因。如果这是真的,我会更喜欢使用行指针。
  • @LauraGalera “我必须使用指针,我肯定知道。”为什么?
  • @LauraGalera 是否需要实现复制/分配等与使用指针无关。正如我所写,您需要遵守 0/3/5 规则,智能指针与否不会改变这一点
  • 因为我有不同的类与 Routes 交互,而且 Routes 不仅有 2 张地图,更多,我可能会复制相同的 Route 20 次......不感兴趣。关于你对使用向量的建议:不是真的,对我来说更有用的是一个列表,因为向量的容量太夸张了,一个列表对我来说是最好的,因为我必须做的就是推回指针(我是对订单不感兴趣)
  • 顺便说一句,当我说我正在处理大量数据时,我之所以这么说是因为原始指针比智能指针意味着更少的空间(但无论如何这并没有太大的区别......)我并不怀疑我是否应该使用指针而不是对象。
猜你喜欢
  • 1970-01-01
  • 2012-05-21
  • 2012-01-13
  • 1970-01-01
  • 2013-05-24
  • 2019-10-03
  • 2012-03-11
  • 1970-01-01
  • 2021-04-05
相关资源
最近更新 更多