1

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

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

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

4

3 回答 3

1

你可以做任何一个,但不能同时做。设计通常最好在分配内存的同一函数中释放内存。

于 2013-11-04T06:43:05.200 回答
1

严格来说,你可以在任何地方释放它,只要你在最后一次使用后完全释放它。1MM 的问题是,根据未来的使用情况,您如何轻松执行此操作?传递具有所有权转移语义的指针通常是不好的。通常,使用分配转移返回指针也很糟糕。如果您设计 API,请考虑抽象分配的对象并具有分配/释放功能(例如allocate_widgetfree-widget)。API 使用不应该知道widget是用 分配的,malloc()并且必须用 释放free()

于 2013-11-04T06:45:08.303 回答
0

您可以在最终函数中为该分配的指针调用 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".
}

还要考虑 Cfree函数释放动态分配的内存但不更改变ptr量值。因此,如果您遇到内存泄漏,一个好的做法是NULL在调用free. 通过这种方式调试代码,您可能会立即知道是否分配了内存(ptr != NULL)或没有(ptr == NULL

if(ptr != NULL) 
{
    free(ptr);
    ptr = NULL;
}
于 2016-05-01T20:35:10.720 回答