c ++:原始指针映射中的复制,删除和运算符=
Posted
技术标签:
【中文标题】c ++:原始指针映射中的复制,删除和运算符=【英文标题】:c++: copy, delete and operator = in map of raw pointers 【发布时间】:2019-11-20 13:23:45 【问题描述】:我有一个关于智能指针和原始指针的问题。
我的第一个想法是使用原始指针:所以如果在一个类(例如类 Routes)中它的属性是 map<string, list<Route *>> _mapIATA
和 map<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
(无论其额外费用如何)。在我开始使用智能指针之前,我曾与太多不稳定的应用程序作斗争。另一个解决方案(我之前尝试过)可能是一个全局向量(或映射),用于存储所有 Route
s 和索引引用(而不是原始指针),至少允许检测丢失的实例......
【参考方案1】:
我正在处理大量数据,这就是我考虑使用原始指针的原因,...
这是一个错误的前提。 std::list
确实在内部使用动态内存。通过添加另一层间接,您将一无所获。当你想指向某物时使用指针。如果你想要对象使用对象。
但是,如果我不使用原始指针,而是使用智能指针,我就不必担心删除指向的内容,但是复制和分配呢?
无论是否使用指针,您都必须确保正确实现了rule of 0/3/5。
我不确定什么会更好;原始或智能指针。
两者都没有。使用map<string, list<Route>>
,除非您需要在多个所有者之间共享Route
s(如果您不知道这意味着什么,那么可能不需要)。
PS:如果您担心性能,可能值得尝试std::vector
而不是std::list
。
【讨论】:
我必须使用指针,我知道这一点。是的,我知道我总是必须实现一个析构函数、一个副本和一个赋值运算符......我的问题更多基于如果我使用智能指针,我应该实现一个副本和 operator = 方法吗?我几乎没有和他们一起工作过,这就是我问的原因。如果这是真的,我会更喜欢使用行指针。 @LauraGalera “我必须使用指针,我肯定知道。”为什么? @LauraGalera 是否需要实现复制/分配等与使用指针无关。正如我所写,您需要遵守 0/3/5 规则,智能指针与否不会改变这一点 因为我有不同的类与 Routes 交互,而且 Routes 不仅有 2 张地图,更多,我可能会复制相同的 Route 20 次......不感兴趣。关于你对使用向量的建议:不是真的,对我来说更有用的是一个列表,因为向量的容量太夸张了,一个列表对我来说是最好的,因为我必须做的就是推回指针(我是对订单不感兴趣) 顺便说一句,当我说我正在处理大量数据时,我之所以这么说是因为原始指针比智能指针意味着更少的空间(但无论如何这并没有太大的区别......)我并不怀疑我是否应该使用指针而不是对象。以上是关于c ++:原始指针映射中的复制,删除和运算符=的主要内容,如果未能解决你的问题,请参考以下文章