c ++:原始指针映射中的复制,删除和运算符=

Posted

技术标签:

【中文标题】c ++:原始指针映射中的复制,删除和运算符=【英文标题】:c++: copy, delete and operator = in map of raw pointers 【发布时间】: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 和索引引用(而不是原始指针),至少允许检测丢失的实例...... 【参考方案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 次......不感兴趣。关于你对使用向量的建议:不是真的,对我来说更有用的是一个列表,因为向量的容量太夸张了,一个列表对我来说是最好的,因为我必须做的就是推回指针(我是对订单不感兴趣) 顺便说一句,当我说我正在处理大量数据时,我之所以这么说是因为原始指针比智能指针意味着更少的空间(但无论如何这并没有太大的区别......)我并不怀疑我是否应该使用指针而不是对象。

以上是关于c ++:原始指针映射中的复制,删除和运算符=的主要内容,如果未能解决你的问题,请参考以下文章

动态数组和删除运算符的 boost::python 内存错误

c 编程中的 * 和 & 运算符有啥区别?

C语言-删除字符串中指定的字符

规定输入的字符串中只包含字母和*号.

Javascript 6中的字典和地图有啥区别? [复制]

共享指针 [] 运算符和 ++ 运算符