我正在创建一个std::map
类型<int, Foo*>
。我正在使用该emplace
函数在 for 循环中填充此地图。在这个循环中,我在Foo f = Foo()
每次循环迭代中创建一个 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));
}
where a
is a vector<int>
in classFoo
问题很清楚。我在下一次重新创建的迭代中插入对f
in的引用,从而使上一个指针过时。如何在仍然保留指向in而不是存储 的副本的同时解决此问题?智能指针是解决方案吗?(我以前从未使用过它们)。mymap
f
f
f
mymap
f
您可能只是想要:
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));
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句