【问题标题】:Freeing a dynamically allocated memory to struct I created properly [duplicate]将动态分配的内存释放给我正确创建的结构[重复]
【发布时间】:2019-04-22 14:36:46
【问题描述】:

在我的作业中,我使用的是我自己创建的结构。问题是在释放分配的内存时,我应该首先释放它的结构字段是否足以调用 free(ptrToStruct)?

struct Prof{
    char* first_name;
    char* second_name;
    char** trained_classes; 
    int count_of_assigned_classes;
    int max_classes_to_take;
    int count_of_trained_classes;
    int assigned_to_untrained;
};

【问题讨论】:

  • 这就是为什么在大多数 C 程序中为每个像这样复杂的结构都有 createrelease 方法很常见的原因。这样分配和释放代码就存在于一个地方

标签: c free dynamic-memory-allocation


【解决方案1】:

没有。如果你的结构中有指向堆分配内存的指针,你应该首先释放它们。原因是结构内的指针指向的区域位于堆的其他部分。释放指向结构本身的指针只会释放结构的内存区域,而不是结构内部指针指向的关联内存区域。

【讨论】:

    【解决方案2】:

    您需要 free() 之前的 malloc() calloc()realloc() 调用返回的每个指针(即指针指向的已分配内存)。换句话说,分配器函数返回的每个指针都需要传递给free()

    此外,一旦传递给free(),就不应再访问内存位置,free() 的方法是首先释放内部成员(需要访问结构指针,如ptrToStruct->first_name ),然后是指向结构本身的指针 (ptrToStruct)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2011-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多