我的代码没有编译错误。它似乎有一个运行时错误。在下面的代码中,当第一次执行while循环时,一切正常。但是在第二次迭代中,一切都停在“list :: iterator k =(temp2-> store).begin();”。当我注释掉“list :: iterator k ...”部分时,一切正常。变量temp2和temp2->存储不是NULL或空。调试器给出了以下消息“项目euler.exe中0x009bc0cf处的未处理异常:0xC0000005:访问冲突读取位置0xddddddf5”。
struct edge
{ int end1, end2;
ptr_to_edge *ptr_end1, *ptr_end2;
edge *next, *l_chd, *r_chd;
edge(): next(NULL), l_chd(NULL), r_chd(NULL), ptr_end1(NULL), ptr_end2(NULL)
{ }
};
struct ptr_to_edge {
int flag, vertex;
list<edge*> store;
ptr_to_edge(): flag(1)
{ }
};
void parallel_reduction_step(ptr_to_edge *front, vector<edge> &a) {
list<edge*>::iterator next = (front->store).begin();
next++;
list<edge*>::iterator current = (front->store).begin();
list<edge*>::iterator last = (front->store).end();
--last;
while(current!= last) {
if(((*current)->end1 == (*next)->end1)&&((*current)->end2==(*next)->end2)) {
edge temp1;
temp1.end1 = (*current)->end1; temp1.end2 = (*current)->end2;
a.push_back(temp1);
ptr_to_edge *temp2;
if ((*current)->end1==front->vertex)
temp2 = (*current)->ptr_end2;
else
temp2 = (*current)->ptr_end1;
list<edge*>::iterator k = (temp2->store).begin();
current = (front->store).erase(j);
*current = &(a.back());
}
else current++;
next++;
}
};
答案 0 :(得分:2)
感谢您清理代码。看起来你在向量a上推送元素,然后在其他结构中将指针指向其元素。这样做的问题是“a”的大小调整(当你添加它时会发生)将导致其元素的指针(或迭代器)变得无效,并且当你在其上推送元素时会发生这种情况。我不知道这是否与您的代码有关,但它可能会导致问题。您可以将“a”更改为deque,当您添加到结尾时,它不会使指向其元素的指针无效,并且它应该修复该部分。
答案 1 :(得分:0)
当您的程序中止时,您获得的错误消息的更多详细信息可能会有所帮助,但无论如何我都会做出疯狂的猜测。如果您的temp2
和temp2->store
值不为NULL,那么temp2->store
可能是一个空容器?也就是temp2->store.begin() == temp2->store.end()
。在尝试取消引用k之前,您可以尝试检查该案例。例如,您可以将while循环更改为
while(reached == 0 && k != temp2->store.end()) {
.
.
.
}
如果temp2->store
为空,则begin迭代器等于end迭代器,并且取消引用end迭代器是坏的。因此,即使最终不是问题,您也应该检查以防止它。