我有一个结构指针的std :: vector,我希望删除重复的条目。但是,我想直接比较结构的一个成员而不是指针。当我以不正确的方式(直接比较指针)时,没有段错误;欺骗根本不会被删除。但是,当我访问有问题的元素进行比较时,我得到了一个段错误。
我的第一个猜测是结构是无效/释放的,但是我可以将该成员放在一个char数组中并在没有问题的情况下将其打印到调试日志中,所以情况似乎并非如此。 / p>
如果结构是有效的(它们似乎都应该是;我在每次添加之前都是calloc),那么我不知道为什么比较它们的成员会导致任何问题。
无论如何,这是我的代码:
结构定义:
81 struct fp_node{
82 Tile *t;
83 unsigned int g;
84 unsigned int h;
85 unsigned int score;
86 struct fp_node *parent;
87 char type;
88 };
无问题地访问该成员
279 #ifdef DEBUG
280 for(unsigned int i = 0; i < open_list.size(); ++i){
281 char address[11];
282 snprintf(address, 11, "0x%08x", open_list[i]->t);
283 gui::log("Open list entry " + std::to_string(i) + ": " + std::string(address));
284 }
285 #endif
欺骗过滤导致问题:
291 for(unsigned int i = 0; i < open_list.size(); ++i){
292 for(unsigned int j = 0; j < open_list.size(); ++j){
293 if(i == j) continue;
294 if(open_list[i]->t == open_list[j]->t){
295 free(open_list[j]);
296 open_list.erase(open_list.begin() + j);
297 i -= 1;
298 j -= 1;
299 }
300 }
301
302 for(unsigned int j = 0; j < closed_list.size(); ++j){
303 if(open_list[i] != closed_list[j]) continue;
304 free(open_list[i]);
305 open_list.erase(open_list.begin() + i);
306 i -= 1;
307 }
308 }
请注意,在第一个j
for循环中,我访问了struct的t成员。这会导致段错误。第二个j
循环只是比较指针。它不是段落错误,但它不是我想要的。
我尝试从tile类访问方法,但是那些段错误也是如此,所以我认为在此期间内存会以某种方式自动释放。我不知道为什么,因为一切都在堆上,除了矢量本身,它们的范围更广,不应该死。
但是,当我尝试仅在比较的一部分(if((Tile *)open_list[i] == open_list[j]->t)
)中访问该成员时,我没有得到段错误;与另一方相同。
我完全迷失在这里,有人可以帮助我吗?
感谢。
答案 0 :(得分:1)
希望我眼中的困倦不是让我的思绪看到斑点,但有些东西突然袭来。
很难说肯定,因为您没有说明如何分配open_list。由于open_list是由free()发布的,我将假设它是由malloc()或calloc()分配的简单指针,这些是C函数。从来没有试过混合malloc()和size(),或new()和free(),但我担心open_list.size()报告的数组大小在free()下不会改变。