0

私は6年以上CまたはC++を使用しておらず、少し錆びています。グラフ走査アルゴリズムの簡単なテストコードを書いています。このコードは、隣接リストスタイルの入力を受け入れます。ただし、free/でいくつかの問題が発生していますmalloc

私のコードには2つの問題があります。

  1. VC ++ cntrl-f5を使用するfreeと、コードなしでコードを実行すると、コードがハングします。getcharこれは、を使用すると改善されます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();
   }
4

1 に答える 1

4

すぐに飛び出すものの1つは、

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回割り当て、最初の割り当てをリークし、2番目の割り当ての結果をチェックしていません。もう一つはあなたのmalloc呼び出しがする必要があるということです

 malloc(size)

いいえ

 malloc(sizeof(size))

現在のコードでは、すべてのメモリの割り当てが不足しているため(各割り当てでは、一度に4バイトしか割り当てられません)、アクセスが全体的に踏みにじられます...実行が実際にgetchar()またはに到達することに驚いていfree()ます。

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

さらに良い解決策は、 BoostGraphのような既存のグラフライブラリを使用することです。

于 2012-04-06T05:31:03.383 に答える