gpt4 book ai didi

c++ - std::list of std::pairs with pointers

转载 作者:行者123 更新时间:2023-11-30 04:00:47 25 4
gpt4 key购买 nike

我正在编写一些简单的连接组件代码并遇到了一个奇怪的段错误。

我的代码如下;首先是一些定义。

Node* node;

typedef std::pair<int, Node*> Edge;

struct Node {
...
std::list<Edge> neighbors;
...
}

出现段错误的代码如下:

if (node->neighbors.empty())
{
node->label = label_set.make();
}
else
{
Node* first_neighbor = node->neighbors.front().second;
node->label = first_neighbor->label;
int i = 0;
for (list<Edge>::iterator it = node->neighbors.begin(); it != node->neighbors.end(); it++)
{
i ++;
Node* n2 = (Node*)it->second;
node->label = label_set.merge(node->label, n2->label);
}
}

真正奇怪的地方如下:

(lldb) p node->neighbors
(std::list<std::pair<int, _Node *>, std::allocator<std::pair<int, _Node *> > >) $4 = size=1 {
[0] = {
first = 78
second = 0x00d85520
}
}
(lldb) p *it
(std::pair<int, _Node *>) $8 = {
first = 0
second = 0xa0a45254
}
(lldb) p n2
(Node *) $5 = 0xa0a45254

看到这里,我明白了段错误。 n2 被设置为一个完全奇怪的值。它不在列表中;我没有正确迭代列表吗? n2 是否因为超出列表边界而填充了随机数据?但是我的迭代是如何越界的呢?我一无所知。

编辑:我肯定在列表边界之外:在段错误时 i == 3

编辑2这可能与我跟踪节点的方式有关吗?

https://gist.github.com/noio/3082a0f351edb1821e90

最佳答案

这可能是正在发生的事情:

如果您确实注释掉了 for 循环中调用 label_set.merge 的最后一行,你剩下一个简单的循环,据说从 std::list 的开始到结束。 .

增量就在那里(即使完成 ++it 会更好,但那是另一回事了),再加上您在循环中所做的就是检索 it->second .但是,正如您声称的那样,您的循环将永远运行。

既然是这样,一个结论是 node无效,或者 node->neighbors是无效的。您需要检查您的代码以确保您没有错误地管理内存或指针。您也可能最好使用智能指针而不是原始指针(甚至可能是

std::pair<int, std::shared_ptr<Node>>

如果 Node 指针确实在各种对象之间共享)。

对于调试器,您可以在无效对象中使用看起来正常的值。可能发生的情况是调试器向您显示无效对象中各个成员的值是什么。由于对象无效,这些值可以是任何值,包括看起来合理的值。

编辑:

您在此处发布的链接:https://gist.github.com/noio/3082a0f351edb1821e90

显示您获取 vector<Node> 中最后一项的地址.如果 vector 调整到更大的容量,这是很危险的,因为 vector 的迭代器将变得无效。不要保留指向 vector 中数据的指针值,除非您可以保证在您使用指针时不会调整 vector 的大小。

关于c++ - std::list of std::pairs with pointers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26104307/

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