我正在创建一个类型为<int, Foo*>
的std::map
。我正在使用emplace
函数在 for 循环中填充此地图。在这个循环中,我正在创建一个 Foo 对象Foo f = Foo()
与每次循环迭代,并将其插入到如下所示的映射中:
std::map<int, Foo*> mymap;
for(int i = 0 ; i < 4; i ++)
{
Foo f = Foo();
mymap.emplace(i, &f);
mymap[i]->a.pushback(pow(i,2));
}
其中a
是班级Foo
中的vector<int>
问题非常明显。我在mymap
中插入了对f
的引用,而在下一次迭代中,我将重新创建f
,使上一个指向f
的指针过时。如何在mymap
中保留指向f
的指针而不是存储f
的副本来解决此问题?智能指针是解决方案吗?(我以前从未使用过它们)。
使用new
.
mymap.emplace(i, new Foo());
有关new
运算符的详细信息,请参阅此处。
您可能只是想要:
std::map<int, Foo> mymap;
for(int i = 0 ; i < 4; i ++)
{
//mymap.emplace(i, Foo()); // operator[] would do similar anyway
mymap[i].a.pushback(pow(i, 2));
}
或者,如果真的想要指针语义
std::map<int, std::unique_ptr<Foo>> mymap;
for(int i = 0 ; i < 4; i ++)
{
mymap.emplace(i, std::make_unique<Foo>());
mymap[i]->a.pushback(pow(i,2));
}
如果你真的想要原始拥有指针:
std::map<int, Foo*> mymap;
for(int i = 0 ; i < 4; i ++)
{
mymap.emplace(i, new Foo()); // calling delete later is required to avoid leak
mymap[i]->a.pushback(pow(i,2));
}