指针比较的C ++段错误

时间:2017-04-23 03:22:13

标签: c++ pointers struct

我有一个结构指针的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))中访问该成员时,我没有得到段错误;与另一方相同。

我完全迷失在这里,有人可以帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:1)

希望我眼中的困倦不是让我的思绪看到斑点,但有些东西突然袭来。

很难说肯定,因为您没有说明如何分配open_list。由于open_list是由free()发布的,我将假设它是由malloc()或calloc()分配的简单指针,这些是C函数。从来没有试过混合malloc()和size(),或new()和free(),但我担心open_list.size()报告的数组大小在free()下不会改变。

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