我在6年多的时间里没有使用过C或C ++,而且有点生疏。我正在为图遍历算法编写一些快速测试代码。该代码接受邻接列表样式输入。但是,我遇到了free
/ malloc
的一些问题。
我的代码存在两个问题:
当我使用VC ++ cntrl-f5运行没有free
且没有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();
}
答案 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));
}
你正在分配两次,泄漏第一次分配,而不是检查第二次分配的结果。另一个原因是您的malloc
电话应该是
malloc(size)
不
malloc(sizeof(size))
因为在你当前的代码中你没有完全分配你的所有内存(每次分配一次只能给你4个字节),你的访问会一直踩到...我很惊讶执行它实际上是getchar()
或free()
。
为什么在使用VC ++时尝试在C中模拟OOP的原因尚不清楚。如果你使用STL容器在C ++中重写它来保存节点并使用索引而不是指针,我认为你的很多问题都会消失。但是现在为你调试这个烂摊子对任何人来说都不会有趣。
更好的解决方案是使用现有的图表库,如Boost Graph