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));
}