2012-04-06 23 views
0

我6年多沒用過C或C++,有點生疏。我正在爲圖遍歷算法編寫一些快速測試代碼。該代碼接受一個鄰接列表樣式輸入。不過,我遇到了free/malloc的一些問題。另一個malloc/free的難題

有兩個問題我的代碼:

  1. 當我運行沒有free和沒有getchar的代碼,當我使用VC++ CNTRL-F5的代碼掛起。這可以在我使用getchar()時得到解決。有誰知道爲什麼?

  2. 當我用free運行代碼時,代碼會掛起。我試圖調試代碼,它完全掛在free聲明。任何關於如何解決這個問題的建議?

另外,請讓我知道如果我做這個代碼危險的事情。頭文件被省略。立即跳出

void * s_malloc(size_t size){ 
    void * ret_pntr = malloc(sizeof(size)); 
    if (ret_pntr == NULL){ 
     printf ("error"); 
     exit(1); 
    } 
    return (void *)malloc(sizeof(size)); 
    } 

    void initialize_graph(graph * G1, int num_vertices){ 
    int i = 0 ; 
    G1->num_vertices = num_vertices; 
    G1->node_list = (node**)s_malloc(sizeof(node*)*num_vertices); 
    for (i = 0; i < num_vertices; i ++){ 
     G1->node_list[i] = (node *)s_malloc(sizeof(node)); 
    } 
    } 

    void free_everything(graph * G1){ 
    int i = 0; 
    node * ref = NULL; 
    for (i = 0; i < G1->num_vertices; i++){ 
     ref = G1->node_list[i]; 
     recursive_remove(ref); 
    } 
    free(G1->node_list); 
    } 

    void recursive_remove(node * ref){ 
    if (ref == NULL){ 
     return; 
    } 
    else{ 
     recursive_remove(ref->next); 
    } 
    free(ref); 
    } 

    int main(){ 
    int i = 0; 
    graph * G1 = (graph*)s_malloc(sizeof(graph)); 
    G1->init = &initialize_graph; 
    G1->init(G1, 10); 
    G1->remove = &free_everything; 
    G1->node_list[0]->value = 1; 
    G1->node_list[0]->next = (node*)s_malloc(sizeof(node)); 
    G1->node_list[0]->next->value = 2; 
    G1->node_list[0]->next->next = NULL; 
    G1->node_list[1]->value = 10; 
    printf("%d\n", G1->node_list[0]->next->value); 
    printf("%d\n", G1->node_list[1]->value); 
    G1->remove(G1); 
    free(G1); 
    getchar(); 
    } 
+0

你是不是也檢查了很多其他的內存分配,你必須一直做下去,當你調用** initialize_graph喜歡**。 – 2012-04-06 05:51:04

回答

4

一件事是,在

void * s_malloc(size_t size){ 
    void * ret_pntr = malloc(sizeof(size)); 
    if (ret_pntr == NULL){ 
    printf ("error"); 
    exit(1); 
    } 
    return (void *)malloc(sizeof(size)); 
} 

你分配兩次,泄漏的第一次分配,而不是檢查第二分配的結果。另一個原因是,你malloc通話應該是

malloc(size) 

malloc(sizeof(size)) 

因爲在當前的代碼,你underallocate所有的內存(每個分配只會給你一次4個字節),你的訪問跺腳各地...我很驚訝執行實際上使它到getchar()free()

不清楚的是你爲什麼要在使用VC++的時候在C中模擬OOP。如果你用C++用STL容器重寫這個來保存你的節點和索引而不是指針,我認爲你的許多問題將會消失。但是現在爲你調試這個爛攤子對任何人來說都不會很有趣。

一個更好的解決方案是使用現有的圖形庫像Boost Graph

+0

超級得到它的工作。我最終將這些代碼移植到只有c編譯器的嵌入式系統中,我只是試圖對其進行測試並儘可能保持乾淨。不過謝謝。 – user1316762 2012-04-06 13:39:25