【问题标题】:Will freeing a structure pointer also free the memory allocated inside of the structure in C?释放结构指针是否也会释放 C 中结构内部分配的内存?
【发布时间】:2017-05-07 13:26:48
【问题描述】:

例如我有这样的结构:

typedef struct{
    char *var = (char*)malloc(20*sizeof(char));
} EXAMPLE;

EXAMPLE *point = (EXAMPLE*)malloc(sizeof(EXAMPLE));

我的第一个问题是,结构内部分配的内存是否只会在我为EXAMPLE指针分配内存时分配?

我的第二个问题,当我使用free(point) 时,分配给var 的内存也会被释放吗?

【问题讨论】:

  • 这不是有效的 C 代码。
  • 我不知道为什么,但是当我提交问题时,它会删除星号
  • 你真的检查过这段代码是否可以编译吗?如果我错了,有人纠正我,但我认为你不能在结构定义中调用malloc(),如果可以的话,这肯定是不好的做法。相反,您应该在结构中纯粹定义您想要的内容,然后在函数中为它定义 malloc() 空间。
  • 附带说明,您不需要(也可能不应该)转换malloc 的返回值。解释见这里:Do I cast the result of malloc?
  • @DanielPorteous: 如果可能的话,在这里调用malloc 将类似于在 OO 语言的构造函数中发生的事情,实际上是合理的做法——但整个事情看起来像是一个奇怪的幻想如果它是 C!

标签: c memory dynamic struct


【解决方案1】:

使用这个结构:

typedef struct{
    char *var;
} EXAMPLE;

请记住,当您为结构分配空间时,您只是为char * 指针分配空间。这个指针只是指向其他地方的内存。当您 free() 结构时,您只是在释放 char * 指针,而不是它指向的实际内存。

因此,如果您创建此结构,然后为您希望var 指向的字符串创建malloc() 空间,则需要free() 字符串以及free()ing 结构。


一些代码演示了它是如何工作的:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct {
    char *var;
} EXAMPLE;

int main(int argc, char *argv[]) {

    // malloc() space for the EXAMPLE struct.
    EXAMPLE *point = malloc(sizeof(EXAMPLE));
    // malloc() space for the string that var points to.
    point->var = malloc(20 * sizeof(char));
    // Copy "Hello!" into this memory (care with strcpy).
    strcpy(point->var, "Hello!");
    // Print it, it works!
    printf("point->var is: %s\n", point->var);

    // Free stuff.
    free(point->var);
    free(point);

    return 0;
}

还请注意,我们不会强制转换 malloc() 的结果,在 C 中你不应该这样做。另请注意,我们free() point->var 首先在 point 之前。这很重要,因为如果我们先free() 指向,我们会丢失指向point->var 的指针,并且会发生内存泄漏。

【讨论】:

    【解决方案2】:

    我忽略了非编译代码,因为没有它问题就很清楚了;-)

    没有。 free() 不知道它指向的结构,所以它只是释放一个“块”。如果该块有指向其他分配内存的指针,那么它们就会被泄露(除非在其他地方有指向这些块的指针)。

    【讨论】:

    • 是的。如果你 malloc 它,你释放它(或者更广泛地说:它应该负责释放它的任何 malloc) - 如果一个库分配内存,则调用回该库应该释放它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-07
    • 2017-04-07
    • 1970-01-01
    • 2023-01-27
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多