gpt4 book ai didi

c - 另一个 malloc/free 困境

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:54 24 4
gpt4 key购买 nike

我已经 6 年多没有使用过 C 或 C++,有点生疏了。我正在为图形遍历算法编写一些快速测试代码。该代码接受邻接列表样式的输入。但是,我在使用 free/malloc 时遇到了一些问题。

我的代码有两个问题:

  1. 当我在没有 free 且没有 getchar 的情况下运行代码时,当我使用 VC++ cntrl-f5 时,代码会挂起。当我使用 getchar() 时,这个问题得到了补救。有谁知道为什么?

  2. 当我使用 free 运行代码时,代码挂起。我尝试调试代码,它正好卡在 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_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。如果您在 C++ 中重写它,使用 STL 容器来保存您的节点并使用索引而不是指针,我认为您的很多问题都会消失。但是现在为你调试这个烂摊子对任何人来说都不会有趣。

更好的解决方案是使用现有的图形库,例如 Boost Graph

关于c - 另一个 malloc/free 困境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10039378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com