我有一个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
答案 0 :(得分:1)
答案取决于程序中使用的对象所有权策略。
如果您希望动态分配的对象的所有权属于sample
,则可以使用两种方法之一。您必须确保在sample
超出范围之前,删除其中包含的所有动态分配的对象。
如果您希望动态分配的对象的所有权不属于sample
,则第二种方法将导致内存泄漏,而第一种方法允许您在使用完对象后将其删除。 / p>
您可以使用智能指针来管理动态分配的对象的生命周期。这样,无论您使用哪种方法向地图添加对象,您的代码都将变得更加简单。例如
std::map<int, std::unique_ptr<Foo>> sample;
sample.insert(std::make_pair(0, std::make_unique<Foo>()));