std::map 作为类成员

Posted

技术标签:

【中文标题】std::map 作为类成员【英文标题】:std::map as class member 【发布时间】:2021-03-10 16:44:35 【问题描述】:

我有一个带有成员 std::mapm_lookupTable 的 X 类。我应该使用以下哪一项:

Class X 
...
private:
    std::map<int,int> m_lookupTable;
...

或在类的析构函数中使用newdelete 进行分配

class X
private:
   std::map<int,int>* m_lookupTable;
    X() 
        m_lookupTable = new std::map<int,int>();
    
    
   ~X()
       delete m_lookupTable;
    
 

什么应该是首选方式,为什么?

【问题讨论】:

如果您没有正确执行 3 或 5 规则,第二个可能会给您带来各种麻烦。 经验法则是永远不要使用newdelete,而是使用容器和智能指针。唯一的例外是在您编写自定义容器或智能指针时。 【参考方案1】:

我建议使用简单的成员。动态分配它,没有任何好处,并且无缘无故地增加了不必要的开销。如果处理不当,还可能会导致内存泄漏。

在使用作业或复制课程时您也必须小心,然后您必须自己处理。

如果可能,总是更喜欢自动而不是动态对象。

【讨论】:

【参考方案2】:

当成员对象的生命周期与外部对象的生命周期相同时,几乎没有理由更喜欢指针。它只会导致更复杂的代码和更多的错误或内存泄漏机会。当它是私有成员时更是如此,因为在这种情况下对象生命周期不太可能需要不同。

【讨论】:

【参考方案3】:

正如上面已经说过的,使用自动的几乎总是首选。它更简单,从长远来看,维护问题也更少。

话虽如此,如果您要存储大量 X 类型的对象,则有一种情况需要使用指针,其中只有一些需要 m_lookupTable,并且您处于内存受限的环境中。这是一种罕见的组合,但并非不可能。

【讨论】:

即使在这种情况下,如果有的话,您应该使用std::unique_ptr 而不是手动分配对象。

以上是关于std::map 作为类成员的主要内容,如果未能解决你的问题,请参考以下文章

带有键的 std::map 作为具有三个 int 成员的结构 [重复]

类中关联容器数据成员的比较函数

如何制作特定类的成员函数或变量的别名(如 STL 容器)

在字符串的 std::map 中查找编译错误,长

将成员函数 ptr 插入地图

由引用传递的迭代器集/映射迭代器不可取消引用