gpt4 book ai didi

c++ - 使用 vector 来最小化堆分配会导致段错误

转载 作者:搜寻专家 更新时间:2023-10-31 01:35:19 25 4
gpt4 key购买 nike

在一个函数中,我创建了一个具有大量空间的 vector ,我将运行时确定数量的对象 (Edge) 推送到该 vector 。然而,其他对象维护指向 Edges 的指针。 vector 内。有时整个程序段错误是因为指针变得无效,我怀疑当 vector 达到容量并重新分配时会发生这种情况,从而使内存地址无效。

有什么办法解决这个问题吗?或者是否有另一种将堆分配组合在一起的解决方案?

注意:这样做的主要动机是尽量减少堆分配,因为这是减慢我的算法的原因。最初我有 vector<Edge *>并且添加的每个元素都是单独分配的。批量分配显着提高了速度,但是 vector此处描述的方法会使指针无效。

您的代码示例,根据要求:这是我声明为堆栈变量的 vector :

vector<Edge> edgeListTemp(1000); 

然后我使用右值重载将其添加到它:

edgeListTemp.push_back(Edge{edge->movie, first, second});

Node对象保留指向这些的指针:

first->edges.push_back(&edgeListTemp.back());
second->edges.push_back(&edgeListTemp.back());

在哪里edges声明如下:

std::vector<Edge *> edges; /**< Adjacency list */

最佳答案

有几种可能的解决方案:

  • 如果您已经预先知道元素的最大数量,请从一开始就对 vector 进行reserve;在达到该大小之前不会重新分配元素;
  • 如果您不知道元素的最大数量/出于性能原因不想预分配最大大小但是您只能从末尾(或从头)添加/删除元素的 vector ,使用 std::deque 代替。 std::deque 保证指向元素的指针不会失效,只要您只从前面/后面压入/弹出即可;
  • std::list 保证永远不会使对元素的引用无效,但它引入了几个严重的性能损失(没有 O(1) 寻址,每个节点一个分配);
  • 如果你想完全忽略这个问题,添加一个间接层,并将指针存储到 vector 中,指向堆上分配的元素;更好的是,制作一个 std::shared_ptr 的 vector ,并始终使用它来保持对元素的引用;这显然有一个缺点,即需要为每个元素分配一次,这可能会或可能不会被接受,具体取决于您的用例。

关于c++ - 使用 vector 来最小化堆分配会导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618190/

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