另一个malloc / free两难

时间:2012-04-06 05:09:21

标签: c pointers malloc free

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

我的代码存在两个问题:

  1. 当我使用VC ++ cntrl-f5运行没有free且没有getchar的代码时,代码会挂起。当我使用getchar()时,这可以解决。有谁知道为什么?

  2. 当我免费运行代码时代码挂起。我试图调试代码,它完全挂起free语句。关于我如何解决这个问题的任何建议?

  3. 如果我对此代码做任何危险,请告诉我。头文件被省略。

      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();
       }
    

1 个答案:

答案 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