我在尝试释放动态创建的数组时收到一个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()的函数,因此是内存泄漏。

10-07 23:05