释放指针传递给分配它的函数

时间:2013-11-04 06:41:24

标签: c pointers malloc free

我有一个函数,其中malloc用于分配指针,指针被传递给另一个函数,然后传递给另一个函数,它在最后使用。

我的问题是,我可以在最终函数中为该分配的指针调用free吗?或者我需要调用malloc被调用的函数。

面临的问题是,我们看到内存泄漏,因为这个分配的指针直到日期才被编码。所以我现在的工作是修复内存泄漏。

3 个答案:

答案 0 :(得分:1)

您可以做任何一种,但不能同时做到。设计通常更好地在分配它的同一个函数中释放内存。

答案 1 :(得分:1)

严格地说,只要您将完全一次并在最后一次使用后释放,您就可以在任何地方释放它。 100万美元的问题是你如何根据未来的使用轻松实施这个问题?传递具有所有权转移语义的指针通常是不好的。一般而言,返回带分配传输的指针也很糟糕。如果您设计API,请考虑抽象正在分配的对象并具有分配/自由函数(例如allocate_widgetfree-widget)。 API使用不应该知道widget已分配malloc(),必须使用free()释放。

答案 2 :(得分:0)

您可以在该分配指针的最终函数中调用free,但这不是一个好习惯。好的做法是在拥有指向已分配内存的主指针的函数内调用自由函数(可能不是分配内存的函数)。 这是一个例子:

void func() 
{
    void* ptr = malloc(...); // ptr variable declared and initialized here.
    func2(ptr);
    func3(ptr);
    func4(ptr);
    free(ptr); // Free memory in function where ptr is declared.
}

或者,如果mallocfree在更高级别的功能中被封装:

void func() 
{
    void* ptr = allocateObject(...); // This function calls "malloc".
    func2(ptr);
    func3(ptr);
    func4(ptr);
    freeObject(ptr); // This function calls "free".
}

还要考虑C free函数可以自由动态分配内存,但不要更改ptr变量值。 因此,如果您遇到内存泄漏,最好在调用NULL后将指针变量设置为free。这样调试代码就可以立即知道内存是分配的(ptr != NULL)还是不分配(ptr == NULL

if(ptr != NULL) 
{
    free(ptr);
    ptr = NULL;
}