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



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

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

面临的问题是,我们看到内存泄漏,因为到目前为止,此分配指针的空闲未编码。所以我的工作是现在修复内存泄漏。

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

您可以执行其中之一,但不能同时执行这两项操作。通常,设计最好在分配内存的同一函数中释放内存。

您可以在最终函数中为该分配的指针调用 free,但这不是一个好的做法。好的做法是在拥有指向已分配内存的主指针的函数内调用 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。因此,如果您遇到内存泄漏,一个好的做法是在调用 free 后将指针变量设置为 NULL。这样调试代码,您可以立即知道是否分配了内存(ptr != NULL)或没有(ptr == NULL

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

相关内容

  • 没有找到相关文章

最新更新