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;
...
或在类的析构函数中使用new
和delete
进行分配
class X
private:
std::map<int,int>* m_lookupTable;
X()
m_lookupTable = new std::map<int,int>();
~X()
delete m_lookupTable;
什么应该是首选方式,为什么?
【问题讨论】:
如果您没有正确执行 3 或 5 规则,第二个可能会给您带来各种麻烦。 经验法则是永远不要使用new
和delete
,而是使用容器和智能指针。唯一的例外是在您编写自定义容器或智能指针时。
【参考方案1】:
我建议使用简单的成员。动态分配它,没有任何好处,并且无缘无故地增加了不必要的开销。如果处理不当,还可能会导致内存泄漏。
在使用作业或复制课程时您也必须小心,然后您必须自己处理。
如果可能,总是更喜欢自动而不是动态对象。
【讨论】:
【参考方案2】:当成员对象的生命周期与外部对象的生命周期相同时,几乎没有理由更喜欢指针。它只会导致更复杂的代码和更多的错误或内存泄漏机会。当它是私有成员时更是如此,因为在这种情况下对象生命周期不太可能需要不同。
【讨论】:
【参考方案3】:正如上面已经说过的,使用自动的几乎总是首选。它更简单,从长远来看,维护问题也更少。
话虽如此,如果您要存储大量 X 类型的对象,则有一种情况需要使用指针,其中只有一些需要 m_lookupTable,并且您处于内存受限的环境中。这是一种罕见的组合,但并非不可能。
【讨论】:
即使在这种情况下,如果有的话,您应该使用std::unique_ptr
而不是手动分配对象。以上是关于std::map 作为类成员的主要内容,如果未能解决你的问题,请参考以下文章