我有一个函数,其中malloc用于分配指针,指针被传递给另一个函数,然后传递给另一个函数,它在最后使用。
我的问题是,我可以在最终函数中为该分配的指针调用free吗?或者我需要调用malloc被调用的函数。
面临的问题是,我们看到内存泄漏,因为这个分配的指针直到日期才被编码。所以我现在的工作是修复内存泄漏。
答案 0 :(得分:1)
您可以做任何一种,但不能同时做到。设计通常更好地在分配它的同一个函数中释放内存。
答案 1 :(得分:1)
严格地说,只要您将完全一次并在最后一次使用后释放,您就可以在任何地方释放它。 100万美元的问题是你如何根据未来的使用轻松实施这个问题?传递具有所有权转移语义的指针通常是不好的。一般而言,返回带分配传输的指针也很糟糕。如果您设计API,请考虑抽象正在分配的对象并具有分配/自由函数(例如allocate_widget
和free-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.
}
或者,如果malloc
和free
在更高级别的功能中被封装:
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;
}