【发布时间】:2012-04-22 05:13:27
【问题描述】:
另一个C题:
假设我有一个结构,它有一个 char* 类型的指针成员。
当我想初始化一个结构体实例时,我调用malloc:
MyStruct* ptr = (MyStruct*)malloc(sizeof(MyStruct)
然后为char*成员分配256字节内存:
ptr->mem = (char*)malloc(sizeof(char)*256);
当我调用指针成员和它指向的内存时会发生什么
free(ptr);?
当我用 valgrind 检查程序时,我发现我有内存泄漏,但是当我明确调用 free(ptr->member); 时,我仍然有内存泄漏,并且 valgrind 显示“无效的免费”错误
管理成员指向的内存的正确方法是什么?
【问题讨论】:
-
你不应该在 C 中转换来自
malloc的返回值。 -
@stefanbachert:见stackoverflow.com/a/605858/129570。
-
@stefanbachert:这是一个争论点。这不是绝对必要的,如果您没有使用选项进行编译以警告您缺少函数声明,则可能会导致错误,因为编译器假定
malloc()返回int而事实并非如此。 OTOH,在 C++ 中,强制转换是必要的。我经常把演员表放进去;我理解为什么人们会忽略它,并且无论哪种方式都不要生气。 -
我认为,问题的部分原因在于很多人使用演员表是因为他们认为自己必须演员表。他们注册它在某些代码中使用并包含它而不知道为什么。此外,我认为,在许多情况下,如果需要强制转换来澄清,那么代码的结构和/或变量的命名等有问题。再往下,我还注意到有些人也使用 malloc 强制转换来抑制错误和演员变成了某种“魔杖”——唯一的问题是它是黑魔法;)
标签: c pointers memory-management struct member