【问题标题】:Linked List memory issue链表内存问题
【发布时间】:2019-07-31 15:52:41
【问题描述】:

我实际上正在研究一个关于链表操作的项目,并且一切正常,但是当我使用 valgrind 运行它时,我发现存在很多内存问题。我把代码的一部分放在这里,我认为分配内存的问题是这样的,也许你可以帮我找出来。

所以,我必须从这种格式的文件中读取:

19971230 20220512 ALklklklk
19970905 20001203 BDHE UNE
20151212 20301123 CLEUSHI
20171221 20301025 DE klkllLU TOPI
20160315 20190227 Ehaaaa

并将它们放在一个链表中,由这个结构表示:

typedef struct cell{
    int dateDeb;
    int dateFin;
    char text[TAILLE_MAX];
    struct cell * suivant;
}message;

一开始我编写了这个函数来初始化列表中的一个块:

message * creationCellule(){

    message * cellule;
    cellule = (message *)malloc(sizeof(message));

    if(cellule != NULL)
    {
        cellule -> dateDeb = 0;
        cellule -> dateFin = 0;
        cellule -> suivant = NULL;
        memset(cellule->text, '\0', TAILLE_MAX);
    }
    return cellule;

}

从文件中读取的函数是这个:

void lectureFichier(const char * nomFichier, message ** tete)
{


    FILE * fp = fopen(nomFichier, "r");
    message * test;
    test = creationCellule();

    if(fp != NULL)
    {

        while(fscanf(fp,"%d %d ", &(test->dateDeb), &(test->dateFin)) == 2)
        { 
            fgets(test -> text, 100, fp);

            insertion(tete, test);
            test =  creationCellule(test);

        }
    }
    fclose(fp);                                                                                                                                                                          
}

插入函数就是这个:

void insertion(message ** tete, message * cellule){

    message ** prec;


    if(cellule != NULL){
            prec = recherche(tete, cellule -> dateDeb);
            cellule -> suivant = *prec;
            *prec = cellule;
    }

} 

Valgrind 告诉我存在内存泄漏并且动态分配的内存没有被释放。这是正确的,因为我没有在这些函数中释放任何东西,但我不知道在哪里使用 free 因为我必须在循环中重用它。这是 valgrind 的结果:

你能告诉我一个解决方案如何解决这个问题,因为我被困在这个问题上。即使我需要函数creationCellule,也没关系。没有义务写那个。非常感谢您!

【问题讨论】:

  • 它会泄漏内存,因为您没有构建 链表。您应该将 first test 分配给 *tete,然后将以下元素相互链接
  • @AnttiHaapala 是的,我正在用插入功能构建它。我用插入来做。
  • 那么插入函数是错误的,但是你忘记将它包含在问题中。
  • 好的,我现在就添加它,您可以检查一下是否可以。谢谢
  • 啊哈,但现在我明白了:您实际上是在哪里插入 last 创建的细胞?

标签: c memory-leaks linked-list valgrind heap-memory


【解决方案1】:

链接列表创建没有问题。但是,一旦您完成读取文件和链接列表,您需要释放。请记住,如果您使用了 malloc(),则必须调用 free() 来释放内存。像这样的东西——freeCellule(),你可以在从lectureFichier()返回之前调用这个函数:

   void freeCellule(message *ptr)
   {
       message * next;
       while (ptr) {
           next = ptr->suivant;
           free(ptr);
           ptr = next;

      }
   }

【讨论】:

  • 谢谢,我用过这个是主要的,但它也不起作用。
猜你喜欢
  • 2011-04-08
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
  • 2016-03-21
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多