过去我总是创建一个这样的地图:
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;
};
是否需要正确创建地图的其他步骤?
感谢您的帮助和/或澄清!
答案 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=
和复制构造函数来自己完成工作。或者,如果要在复制的实例之间共享映射,则应实现引用计数机制。