1

我在函数中创建了一个链表,并且在程序的其余部分中,我使用指针访问该列表。现在我将如何在我的程序结束时释放这个链接列表?我是直接使用free(CircuitData)还是必须遍历释放每个节点的列表?写这篇我想释放每个节点是显而易见的答案......

在旁注中,我还想问一下如何找出程序期间分配的所有内存是否都被正确释放?

 ListNodeType *CircuitData;
 CircuitData = NULL;
 ReadFile(&CircuitData, &numEl, &numNodes);


void ReadFile(ListNodeType **CircuitData, int *numEl, int *numNodes){

    ListNodeType *newPtr, *tempPtr;
    newPtr = malloc(sizeof(ListNodeType));
    *CircuitData = newPtr;
    newPtr->nextPtr = NULL;

    //MORE CODE
4

4 回答 4

6

我会想到这样的事情:

struct node
{
    int data;
    node* next;
} *head;

void deleteAllNodes(node* start)
{
    while (start != NULL)
    { 
        node* temp = start; 
        start = start -> next;
        free(temp);
    }
}
于 2013-10-21T23:52:19.267 回答
3

我认为你可以这样做:

void freeFunction(ListNodeType *CircuitData)
{
    void *victim;

    while (CircuitData)
    {
        victim = CircuitData;
        CircuitData = CircuitData->next;
        free(victim);
    }
}
于 2013-10-21T21:43:03.490 回答
2

对于每一个malloc你都需要一个,free否则你会泄漏内存。分析程序以查看是否没有内存泄漏的一种可能方法是使用Valgrind

于 2013-10-21T21:37:07.567 回答
2

对于您的第一个问题,是的,您应该遍历列表和free每个节点。

第二个问题有点难回答。如果您在内存中有一个对象,但无法访问它,那就是内存泄漏。

您可以使用一些工具来分析内存池。查看 valgrind:

http://valgrind.org/

于 2013-10-21T21:38:19.963 回答