好的,这可能是一个愚蠢的问题但是这里有: 在C中,只要在malloc返回的指针上使用free()就足够了,即使malloc分配的内存区域可能很大并且可能已经被转换为不同的类型和结构等。
答案 0 :(得分:5)
是。内存管理器会处理这个问题。它知道内存有多大,只要你不写过malloc()大小的边界,就没问题了。
答案 1 :(得分:5)
是和否。
是:分配 - 无论大小如何,无论你使用它 - 都将被释放。
否:如果您将指针存储到其他malloc
'ed分配中,并且没有这些指针的另一个副本,则释放原始分配而不用首先释放孩子将是记忆泄漏。
答案 2 :(得分:4)
不仅可以,而且仅方式释放由malloc()
分配的内存块,是将malloc()
返回的指针赋予free()
至于“可能被分为不同的类型和结构等”的问题。 - 就malloc()
和free()
而言,没有任何问题,只要你释放该区块就没有任何东西可以主动使用它了。但是,您可能需要关注有关转换为“不同类型和结构”的其他问题,例如对齐和别名问题 - 但malloc()
和free()
不参与其中(只要您不要破坏分配块之外的内存。)
答案 3 :(得分:1)
添加到JoshD帖子中,malloc()返回的“类型”是void*
- 所以它只是一个原始地址,您可以将其输入任何“不同类型和支柱”。因此,可以自由地调用它,它将通过调用malloc释放你最初获得的相同数量的内存。
答案 4 :(得分:1)
考虑它的简单方法是每个malloc必须有相应的免费。如果你malloc一个结构,其中包含指向其他malloc的项目的指针,释放该结构不会释放指向的其他项目。必须释放那些其他项目,以免泄漏记忆。
答案 5 :(得分:0)
对于dmckee帖子,你必须考虑如何构建你的结构: 如果它像b树,列表。指向其他dinamically分配结构的指针数组,在这种情况下,您必须首先释放子节点(例如,b树的子节点),然后返回根节点(可能是递归地,取决于结构)。 这是一个非常常见的错误,它可能导致大量内存泄漏