C Segfault在指针比较上

C++ segfault on pointer comparison

本文关键字:比较 指针 Segfault      更新时间:2023-10-16

我有一个结构指针的std ::向量,我想在其中删除重复的条目。但是,我想比较结构的一个成员,而不是直接的指针。当我这样做时,以错误的方式(直接比较指针(没有segfault。骗子根本不会被删除。但是,当我访问有关元素进行比较时,我会得到一个segfault。

我的第一个猜测是结构是无效的/释放的,但是我可以将该成员放在char数组中,并在没有问题的情况下将其打印到调试日志中,因此情况似乎并非如此。<<<<<<<<

如果结构是有效的(它们似乎是并且应该是;我在添加之前每个人都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循环中,我访问结构的t成员。这会导致segfault。第二个j循环确实比较了指针。它不是segfault,但不是我想要的。

我尝试从瓷砖类访问方法,但是那些segfault也是如此,所以我确实认为内存在某种程度上是在某种程度上自动释放的。我不知道为什么,因为除了向量本身外,一切都在堆上,这些矢量本身是更大的范围,不应该死的。

但是,当我尝试在比较的一个部分(if((Tile *)open_list[i] == open_list[j]->t)(中访问成员时,我没有得到segfault;与另一侧一样。

我在这里完全迷路了,有人可以帮我吗?

谢谢。

希望我眼中的昏昏欲睡不是让我的想法看到斑点,而是对我有些事情。

很难肯定地说,因为您不说open_list是如何分配的。由于free((释放了open_list,因此我将假设这是由malloc((或calloc((分配的简单指针,并且这些是C函数。从未尝试过将malloc((和size((或new((和free((混合,但我担心open_list.size((报告的数组尺寸不会在free((下变化。

请参阅http://www.cplusplus.com/reference/array/array/array/size/