C中的释放结构是否也删除了其成员



我对C很新,我对分配内存有一个疑问。因此,我在下面尝试了此代码,该代码应释放结构Elem1。

struct elem{
    char *data1;
    char *data2;
};
int main()
{
    struct elem *elem1 = malloc(sizeof(struct elem));
    elem1->data1 = "abc";
    elem1->data2 = "def";
    char *a = elem1->data1;
    char *b = elem1->data2;
    free(elem1);
    printf("%sn%sn",a,b);
    return 0;
}

代码可以很好地编译,然后回馈,

abc 
def

我希望它会失败,因为免费的也应该释放其成员的记忆。但是为什么起作用呢?如果我想在释放结构后要访问结构的成员,该怎么办?

成员是结构的一部分。释放结构可以使所有成员交易。

但是,在您的示例中,成员只是指示。您将指针复制到结构(node->data1 = ...(中,然后将指针复制到结构(... = node->data1(中,然后释放结构。这些都不影响指针指向的内存。

在您的示例中,实际字符串存储在静态内存中(它们是字符串文字(。这意味着它们从未被摧毁;只要程序正在运行,它们就会生存。这就是为什么打印它们完全安全的原因。您的代码很好。

最后,访问释放的内存具有不确定的行为(这意味着任何事情都可能发生,包括程序崩溃或看起来正确工作(。如果您想访问已释放的结构的成员,那就这样做:

struct elem *p = malloc(sizeof *p);
free(p);
p->data1 = "boom!";  // Undefined behavior!

但是,这将是一个错误,所以...请不要。

每个 malloc必须与相应的 free保持平衡。

您的分配node->data1 = "abc";分配了指向读取字面 "abc"的指针,因此这里没有动态内存,因此您不得使用free

在您的特殊情况下,您可以保留该指针astruct上调用free的指针,因为您不必free该内存,并且它不属于struct。但这一般不起作用:如果您使用malloc设置node->data1,则(1(您必须在该指针上拨打free 您尝试在struct上调用free,并且(2(随后的node->data1尊重的行为将不确定。

相关内容

  • 没有找到相关文章

最新更新