我在尝试释放动态创建的数组时收到一个SIGTRAP信号,但不知道原因。
我这样分配数组:
int* visited = (int*) malloc( l.nodeCount * sizeof(int));
(l.nodeCount是一个整数。在我得到这个错误的程序实例中,它被设置为12。)
当我尝试
free(visited)
时,我在调试器中得到SIGTRAP信号。整个功能就是这个:
int Graph_GetSmallestPathCount(AdjacencyList l, int destination){
//One path if destination is root
if(destination == 0) return 1;
if(l.nodeCount == 0)
return 0;
Queue reading = Queue_NewQueue();
Queue storing = Queue_NewQueue();
/*Allocates visited array*/
int* visited = (int*) calloc( l.nodeCount, sizeof(int));
/*Visited array initialization*/
int i;
for(i = 0; i < l.nodeCount; i++)
visited[i] = 0;
/*Marks root node and enqueues it*/
visited[0] = 1;
Queue_Enqueue(&reading, 0);
//While there are nodes to read
while(!Queue_IsEmpty(reading))
{
//Dequeues a node
int v = Queue_Dequeue(&reading);
//Gets it's adjacency list
List* currentList = AdjacencyList_GetAdjacentNodes(l, v);
listCell* auxCell = currentList->head->next;
//While there are nodes in it's adjacency list
while(auxCell != NULL){
//Enqueues it if it has not been visited
if(visited[auxCell->data] == 0){
Queue_Enqueue(&storing, auxCell->data);
}
//Adds to the paths to that node
visited[auxCell->data] += visited[v];
auxCell = auxCell->next;
}
//When the queue ends
if(Queue_IsEmpty(reading)){
//If the destination has been reached, return
if(visited[destination] > 0){
Queue_Destroy(&reading);
Queue_Destroy(&storing);
return visited[destination];
}
else{
//Switch queues
Queue_Destroy(&reading);
reading = storing;
storing = Queue_NewQueue();
}
}
}
//Destination has not been reached before end of algorithms. Deallocate everything and return 0
free(visited);
Queue_Destroy(&reading);
Queue_Destroy(&storing);
return 0;
}
很抱歉没有评论,我是跑来跑去的,没有发表任何评论。也很抱歉printf过载,我把它们放在那里,同时试图找出问题所在。
编辑:我整理了一下。
奇怪的是,程序只为某些输入工作,而不为其他输入工作。
希望有人能帮助我
最佳答案
我不能告诉你为什么你会得到一个SIGTRAP
,因为你还没有发表一个最小的例子。
不过,我可以告诉你如何发现自己:
使程序可读。每行使用一条指令。indent
工具是你的朋友。当然,这并不能解决这个错误,但它会让你更容易找到它。
别那样。不需要转换malloc
的返回值,使用malloc
或类似的方法更容易阅读。
实际上,calloc(l.nodeCount, sizeof (int));
的意思是您已经命中了断点指令。毫无疑问,实际发生的情况是,您跳转到了一些不是您的代码的地方,而且可能根本不是代码,而是包含用于断点的二进制代码。为什么会这样?通常的原因是内存损坏,特别是堆栈损坏。我猜SIGTRAP
正在破坏它自己的堆栈。我想这是因为你正在(某处)写你分配的内存之外的内存。要测试这一点,请使用紧跟着free()
和malloc()/calloc()
的free()
运行程序。如果这行得通的话,你知道问题出在你之间。
我们无法判断您之间在做什么,因为您还没有(谢天谢地)发布完整的程序,但尝试在exit(0)
下运行它。当你得到一个超出范围的写,valgrind
通常会拿起它。修正每个valgrind
警告。这不能保证解决问题,但在我的经验中,95%的时间都能找到。
还要注意,valgrind
似乎退出了没有return visited[destination];
-ING free()
的函数,因此是内存泄漏。