在地图上初始化对象的正确方法

时间:2018-07-18 21:30:04

标签: c++ dictionary object insert stdmap

我有一个std :: map,它有一个int作为键,一个对象指针作为值。创建时,我应该首先分别实例化对象,然后将其插入容器中,还是可以直接在insert方法中调用“ new”标记?除了简化代码之外,使用其中之一还有什么优势?

map<int, Foo*> sample;

Foo* foo = new Foo();

sample.insert(pair<int, Foo*>(0, foo));       //case 1
sample.insert(pair<int, Foo*>(0, new Foo())); //case 2

1 个答案:

答案 0 :(得分:1)

答案取决于程序中使用的对象所有权策略。

如果您希望动态分配的对象的所有权属于sample,则可以使用两种方法之一。您必须确保在sample超出范围之前,删除其中包含的所有动态分配的对象。

如果您希望动态分配的对象的所有权不属于sample,则第二种方法将导致内存泄漏,而第一种方法允许您在使用完对象后将其删除。 / p>

您可以使用智能指针来管理动态分配的对象的生命周期。这样,无论您使用哪种方法向地图添加对象,您的代码都将变得更加简单。例如

std::map<int, std::unique_ptr<Foo>> sample;
sample.insert(std::make_pair(0, std::make_unique<Foo>()));