C ++如何创建一个即使对象被覆盖也会持续存在的指针?

c++ how to create a pointer that will last even when object is overwritten?

本文关键字:覆盖 指针 存在 对象 何创建 创建 一个      更新时间:2023-10-16

我正在创建一个类型为<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));
}