我有一个结构指针的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/