正确使用std :: map作为类成员

时间:2013-09-27 08:13:45

标签: c++ pointers map

过去我总是创建一个这样的地图:

class TestClass
{
    private:
        std::map<int,int> *mapA;
};

TestClass::TestClass
{
    mapA = new std::map<int,int>();
}

TestClass::~TestClass
{
    mapA->clear(); // not necessary
    delete mapA;
}

所以,现在我在Stackoverflow上阅读了所有地方:尽可能频繁地避免指示

目前我想创建没有指针和新的地图(不需要自己删除对象,减少内存泄漏的危险)!

class TestClass
{
    public:
        TestClass() : mapA() // this is also needed?
        {};
    private:
        std::map<int,int> mapA;
};

是否需要正确创建地图的其他步骤?

感谢您的帮助和/或澄清!

2 个答案:

答案 0 :(得分:7)

不,就是这样,你不需要在构造函数中显式初始化它。

答案 1 :(得分:3)

正如zennehoy所说,没有必要在TestClass构造函数中初始化地图。 让我注意两种实现之间的区别:

在第一个中,当前编写的TestClass不可复制而没有不良影响,因为复制了动态分配映射的原始指针:

TestClass *A = new TestClass;      // A has a map
TestClass *B = new TestClass(A);   // B shares the map with A!

delete A; // this deletes A's map (in destructor)
delete B; // this deletes A's map again! wrong

在你的第二个实现中,这不会发生,因为地图,而不仅仅是它的地址,是完全复制的。

要在第一个实现中解决该问题,您应该使用共享指针,或者通过实现operator=和复制构造函数来自己完成工作。或者,如果要在复制的实例之间共享映射,则应实现引用计数机制。