【发布时间】:2017-05-25 22:22:38
【问题描述】:
我遇到了一个我不太明白的问题:
我正在用
创建一个对象 Edgeedge_vec1.push_back(Edge(src,dest));
然后我想在一个单独的向量中保留一个指向这个 Edge 的指针:
edge_vec2.push_back(&edge_vec1.back());
但是,一旦我添加了第二个 Edge 对象,指向 edge_vec2 中第一个 Edge 的指针就会失效(获取一些随机数据)。是否因为 edge_vec2 中的指针实际上指向 edge_vec1 中的某个位置,而不是底层元素?我可以通过在堆上创建我的 Edge 对象来避免这种情况,但我想了解发生了什么。
谢谢。
【问题讨论】:
-
为什么要首先存储指向数组元素的指针?你不能只存储一个索引吗?
-
@InternetAussie 好吧,我确实将元素存储在第一个向量中。但是假设第一个容器实际上是更复杂的东西,例如邻接表。然后没有索引,但我想保留一个快速迭代所有边缘的选项
-
最简单的解决方案是在两个容器中都存储指针并动态创建对象。
-
这个问题和答案非常依赖于容器。对于不同的容器,失效发生的方式非常不同;例如,使
std::list中的迭代器无效就更难了。如果第一个容器不是字面上的vector,那么这不是您可以为这个问题简化的细节。 -
@Logman 是的,直到您必须管理所有动态分配的内存。智能指针在这方面会有所帮助。