私は6年以上でCまたはC++を使用しておらず、少し錆びています。グラフトラバーサルアルゴリズムのための簡単なテストコードを書いています。このコードは、隣接リスト形式の入力を受け入れます。しかし、私はfree
/malloc
でいくつかの問題に取り組んでいます。もう1つのmalloc/freeジレンマ
私のコードには2つの問題があります:私はfree
なしでコードを実行すると、私はVC++ CNTRL-F5キーを使用する場合getchar
せずにコードがハングアップしたとき
が。これは
getchar()
を使用すると解決されます。なぜ誰が知っていますか?無料でコードを実行するとコードがハングします。コードをデバッグしようとしましたが、これは正確に
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();
}
のような既存のグラフライブラリを使用することです。 –