另一个malloc/free困境 我在6年内还没有使用C或C++,有点生疏了。我正在为图形遍历算法编写一些快速测试代码。该代码接受邻接列表样式输入。但是,我在使用免费/malloc时遇到了一些问题
我的代码有两个问题:另一个malloc/free困境 我在6年内还没有使用C或C++,有点生疏了。我正在为图形遍历算法编写一些快速测试代码。该代码接受邻接列表样式输入。但是,我在使用免费/malloc时遇到了一些问题,c,pointers,malloc,free,C,Pointers,Malloc,Free,我的代码有两个问题: 当我在没有free和getchar的情况下运行代码时,当我使用VC++cntrl-f5时,代码将挂起。当我使用getchar()时,这一问题得到了解决。有人知道为什么吗 当我在空闲状态下运行代码时,代码挂起。我试着调试代码,但它正好挂在free语句上。关于如何解决这个问题,有什么建议吗 另外,如果我使用此代码做了任何危险的事情,请告诉我。头文件被省略 void * s_malloc(size_t size){ void * ret_pntr = malloc(s
free
和getchar
的情况下运行代码时,当我使用VC++cntrl-f5时,代码将挂起。当我使用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();
}
void*s\u malloc(大小){
void*ret_pntr=malloc(sizeof(size));
如果(ret_pntr==NULL){
printf(“错误”);
出口(1);
}
返回(void*)malloc(sizeof(size));
}
无效初始化图(图*G1,整数个顶点){
int i=0;
G1->num_顶点=num_顶点;
G1->node_list=(node**)s_malloc(sizeof(node*)*num_顶点);
对于(i=0;inode_list[i]=(node*)s_malloc(sizeof(node));
}
}
无任何内容无效(图*G1){
int i=0;
节点*ref=NULL;
对于(i=0;inum_顶点;i++){
ref=G1->node_list[i];
递归删除(ref);
}
自由(G1->节点列表);
}
无效递归删除(节点*ref){
如果(ref==NULL){
返回;
}
否则{
递归删除(参考->下一步);
}
免费(参考);
}
int main(){
int i=0;
图*G1=(图*)s_malloc(图的大小);
G1->init=&初始化图;
G1->init(G1,10);
G1->remove=&释放所有内容;
G1->节点列表[0]->值=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->节点列表[1]->值=10;
printf(“%d\n”,G1->node\u list[0]->next->value);
printf(“%d\n”,G1->node\u list[1]->值);
G1->移除(G1);
自由(G1);
getchar();
}
一件立即跳出来的事情是
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)
不是
因为在您当前的代码中,您未充分分配所有内存(每次分配一次只能给您4个字节),所以您的访问会到处乱跑。。。我很惊讶执行过程居然进入了getchar()
或free()
现在还不清楚的是,为什么在使用VC++时要尝试在C中模拟OOP。如果你用C++来重写这个,使用STL容器来保存你的节点,用索引代替指针,我想你的很多问题就会消失。但是现在,为你调试这个混乱局面对任何人来说都不是一件有趣的事
更好的解决方案是使用现有的图形库,比如
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)
不是
因为在您当前的代码中,您未充分分配所有内存(每次分配一次只能给您4个字节),所以您的访问会到处乱跑。。。我很惊讶执行过程居然进入了getchar()
或free()
现在还不清楚的是,为什么在使用VC++时要尝试在C中模拟OOP。如果你用C++来重写这个,使用STL容器来保存你的节点,用索引代替指针,我想你的很多问题就会消失。但是现在,为你调试这个混乱局面对任何人来说都不是一件有趣的事
一个更好的解决方案是使用现有的图形库,如您不需要检查许多其他内存分配,而在调用initialize\u graph时,您必须始终这样做。您也不需要检查许多其他内存分配,而在调用initialize\u graph时,您必须始终这样做。Super让它正常工作。我最终将把这段代码移植到一个只有c编译器的嵌入式系统中,我只想测试它,并尽可能保持它的干净。再次感谢你,超级棒,成功了。我最终将把这段代码移植到一个只有c编译器的嵌入式系统中,我只想测试它,并尽可能保持它的干净。不过再次谢谢你。