c ++如何创建一个指针,即使对象被覆盖也会持续存在?
c++ how to create a pointer that will last even when object is overwritten?
我正在创建 std::map
类型 <int, Foo*>
。我使用 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
是 class Foo
中的 vector<int>
问题很清楚。我在 mymap
中插入对 f
的引用,而在下一次迭代中我正在重新创建 f
,使之前指向 f
的指针过时。如何在 mymap
中保留指向 f
的指针而不是存储 f
的副本的同时解决此问题?智能指针是解决方案吗? (我以前从未使用过它们)。
使用new
。
mymap.emplace(i, new Foo());
有关 new
运算符的更多信息,请参阅 here。
您可能只是想要:
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));
}
我正在创建 std::map
类型 <int, Foo*>
。我使用 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
是 class Foo
中的 vector<int>
问题很清楚。我在 mymap
中插入对 f
的引用,而在下一次迭代中我正在重新创建 f
,使之前指向 f
的指针过时。如何在 mymap
中保留指向 f
的指针而不是存储 f
的副本的同时解决此问题?智能指针是解决方案吗? (我以前从未使用过它们)。
使用new
。
mymap.emplace(i, new Foo());
有关 new
运算符的更多信息,请参阅 here。
您可能只是想要:
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));
}