gpt4 book ai didi

c++ - 推送新对象时,指向该对象的指针变为垃圾

转载 作者:太空狗 更新时间:2023-10-29 23:26:17 25 4
gpt4 key购买 nike

当我从映射中的 vector 中推送对对象的引用时,引用 vector 中的先前值变为垃圾,但原始对象不会。

这是重现问题的最少代码:

#include <iostream>
#include <vector>
#include <map>
#include <string>

class foo
{
private:
std::map<std::string, std::vector<int>> _allObjs;
std::vector<int*> _someObjs;

public:
void addObj(const std::string &name, int obj)
{
_allObjs[name].push_back(obj);
_someObjs.push_back(&_allObjs[name].back());
}

void doStuff()
{
for (auto &obj : _someObjs)
{
std::cout << *obj << std::endl;
}
}

};

int main()
{
foo test;
test.addObj("test1", 5);
test.addObj("test1", 6);

test.addObj("test2", 7);
test.addObj("test2", 8);

test.doStuff();
}

Expected Output
5
6
7
8

Actual Output
-572662307
6
-572662307
8

在调试的时候发现在addObj中把对象push到_allObjs指针就变成了垃圾。我不知道是什么原因造成的,所以我帮不上什么忙。谢谢!

最佳答案

vector 将其数据存储在连续的内存块中。

当您想要存储的内容超出其当前容量时,它将分配一个新的、更大的连续内存块,并将所有现有元素从前一个内存块复制/移动到新内存块中。

当您存储指向您的整数 (&_allObjs[name].back()) 的指针时,您将 int 的内存地址存储在 one这些内存块。

一旦 vector 增长到需要创建额外空间的大小,所有这些内存地址将指向已释放的地址。访问它们是未定义的行为。

关于c++ - 推送新对象时,指向该对象的指针变为垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38445677/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com