4

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

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;
};

需要正确创建地图的任何进一步步骤吗?

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

4

2 回答 2

8

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

于 2013-09-27T08:16:54.347 回答
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=和复制构造函数自己完成工作。或者,如果你想真正在复制的实例之间共享映射,你应该实现一个引用计数机制。

于 2013-09-27T08:27:39.490 回答