2012-04-06 3 views
0

私は6年以上でCまたはC++を使用しておらず、少し錆びています。グラフトラバーサルアルゴリズムのための簡単なテストコードを書いています。このコードは、隣接リスト形式の入力を受け入れます。しかし、私はfree/mallocでいくつかの問題に取り組んでいます。もう1つのmalloc/freeジレンマ

私のコードには2つの問題があります:私はfreeなしでコードを実行すると、私はVC++ CNTRL-F5キーを使用する場合getcharせずにコードがハングアップしたとき

  1. が。これはgetchar()を使用すると解決されます。なぜ誰が知っていますか?

  2. 無料でコードを実行するとコードがハングします。コードをデバッグしようとしましたが、これは正確に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

のような既存のグラフライブラリを使用することです。 –

答えて

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)); 
} 

にあなたが最初の割り当てを漏洩し、二回割り当てられ、第2の割り当ての結果を確認していないということです。もう一つは、あなたの現在のコードでは、あなたがすべてのあなたの記憶をunderallocateのでごmalloc呼び出しは(各割り当ては一度にあなたに4つのバイトを与える)

malloc(size) 

ない

malloc(sizeof(size)) 

でなければならないことで、あなたのアクセスが踏みつけます全部...私は実行が実際にそれをgetchar()またはfree()にすることに驚いています。

VC++を使用しているときにCでOOPをエミュレートしようとする理由がわかりません。これをC++で書き直して、STLコンテナを使ってノードを保持し、ポインタではなくインデックスを使用すると、多くの問題がなくなると思います。しかし、今、あなたのためにこの混乱をデバッグすることは、誰にとっても楽しいことではありません。

アンでもよりよい解決策はまた、あなたは** initialize_graph **呼び出すときにいつも好きですしなければならない他の多くのメモリ割り当てをチェックされていないBoost Graph

+0

スーパーはそれを働かせました。私は最終的にこのコードをcコンパイラだけを持った組み込みシステムに移植します。私はそれをテストし、可能な限りクリーンにしようとしています。しかしもう一度ありがとう。 – user1316762

関連する問題