2016-03-15 87 views
-3

顯然,我的代碼中找不到一些泄漏。我也相信我錯誤地實現了一個堆棧。這裏是來自valgrind的相關文件和錯誤。此外,任何編碼慣例或提示將不勝感激,因爲我仍然從動態分配和指針開始。c - 我的堆棧實現中的數據泄漏

stack.c

#include <stdlib.h> 
#include "stackNode.h" 
#include "stack.h" 

void push(StackNode** stack, char* data) { 
    StackNode* n = makeStackNode(data, *stack); 
    stack = &n; 
} 

char* top(StackNode* stack) { 
    if (emptyStack(stack) == 0) { 
    return stack->data; 
    } 
    exit(0); 
} 

void pop(StackNode** stack) { 
    if (emptyStack(*stack) == 0) { 
    StackNode* temp = *stack; 
    stack = &((*stack)->next); 
    free(temp->data); 
    free(temp->next); 
    free(temp); 
    } 
    exit(0); 
} 

int emptyStack(StackNode* stack) { 
    if (stack == NULL) { 
    return 1; 
    } 
    return 0; 
} 

stackNode.h

#ifndef STACK_NODE_H 
#define STACK_NODE_H 

typedef struct StackNode { 
    char* data;  // data associated with the node  
    struct StackNode* next; // pointer to next node (NULL if none) 
} StackNode; 

StackNode* makeStackNode(char* data, StackNode* next); 

#endif 

stackNode.c

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#include "stackNode.h" 

StackNode* makeStackNode(char* data, StackNode* next) { 
    StackNode* res = NULL; 
    res = malloc(sizeof(StackNode)); 

    res->data = malloc(strlen(data) + 1); 
    strcpy(res->data, data); 

    res->next = malloc(sizeof(StackNode)); 
    res->next = next; 

    return res; 
} 

interp.c(主函數)

#include "interp.h" 
#include "stackNode.h" 
#include "stack.h" 

#include <stdlib.h> 
#include <stdio.h> 

int main(int argc, char* argv[]) { 
    StackNode* stack = NULL; 
    push(&stack, "fire"); 
    push(&stack, "test"); 
    while(emptyStack(stack) == 0) { 
    char* tk = top(stack); 
    pop(&stack); 
    printf("%s", tk); 
    } 
    return EXIT_SUCCESS; 
} 

Valgrind的錯誤

==7811== Memcheck, a memory error detector 
==7811== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==7811== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info 
==7811== Command: ./interp 
==7811== 
==7811== 
==7811== HEAP SUMMARY: 
==7811==  in use at exit: 42 bytes in 4 blocks 
==7811== total heap usage: 4 allocs, 0 frees, 42 bytes allocated 
==7811== 
==7811== 21 (16 direct, 5 indirect) bytes in 1 blocks are definitely lost in loss record 3 of 4 
==7811== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==7811== by 0x400C40: makeStackNode (stackNode.c:9) 
==7811== by 0x400B54: push (stack.c:7) 
==7811== by 0x4007C8: main (interp.c:11) 
==7811== 
==7811== 21 (16 direct, 5 indirect) bytes in 1 blocks are definitely lost in loss record 4 of 4 
==7811== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==7811== by 0x400C40: makeStackNode (stackNode.c:9) 
==7811== by 0x400B54: push (stack.c:7) 
==7811== by 0x4007D9: main (interp.c:12) 
==7811== 
==7811== LEAK SUMMARY: 
==7811== definitely lost: 32 bytes in 2 blocks 
==7811== indirectly lost: 10 bytes in 2 blocks 
==7811==  possibly lost: 0 bytes in 0 blocks 
==7811== still reachable: 0 bytes in 0 blocks 
==7811==   suppressed: 0 bytes in 0 blocks 
==7811== 
==7811== For counts of detected and suppressed errors, rerun with: -v 
==7811== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0) 
+1

在'push'中,使用'stack =&n;'您正在接收一個自動局部變量的地址,並且將其分配給一個參數,因此它在該函數外無效。你想要'* stack = n;'。 – molbdnilo

+0

@molbdnilo d'oh我沒有注意到。 –

回答

1

res->next = malloc(sizeof(StackNode)); 

或許應該只是

res->next = NULL; 

,或者如果以後分配完全刪除。

同樣pop不應該是free ing next項目,否則您將擁有雙免費項目。

+0

或被簡單刪除,因爲剛剛分配到下一個 – Garf365

+0

@ Garf365沒有看起來那麼遠 –

+0

Valgrind告訴我在做出上述建議後,我仍然在makeStackNode()函數中泄漏了一些信息。但是,您的建議可以解決大部分泄漏問題 –