C ++如何创建一个即使对象被覆盖也会持续存在的指针?
c++ how to create a pointer that will last even when object is overwritten?
我正在创建一个类型为<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));
}
相关文章:
- C++指针在 for 循环中被覆盖
- C++ - 更新指针中的值被覆盖
- 将指针uint8覆盖到指针uint16
- 函数结束后覆盖的指针
- C ++如何创建一个即使对象被覆盖也会持续存在的指针?
- 为什么我们不能在C++中覆盖函数指针?
- 创建库以覆盖迭代器的操作员*() - 风险悬挂指针
- 每个方法调用上都覆盖了本地变量指针
- 如何在不覆盖C 中保留指针的价值
- 覆盖指针到会员功能
- C++获取指向受保护覆盖函数的指针
- 指针覆盖旧指针
- 是否可以从 C++11 智能指针继承并覆盖相关运算符?
- 矢量覆盖对象指针
- 为什么来自覆盖类的指针使用运算符==和基类中的运算符!=
- 用静态数组覆盖指针属性
- C++使用*i指针打开文件,在Linux中覆盖,但在Windows中不覆盖
- pthread循环覆盖指针
- 类指针覆盖
- 是覆盖返回类型所需的指针-继承