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

C 释放传递给分配指针的函数的指针,c,pointers,malloc,free,C,Pointers,Malloc,Free,我有一个函数,其中malloc被用来分配一个指针,指针被传递到另一个函数,然后被传递到另一个函数,最后一次使用它 我的问题是,我能在最后一个函数中为分配的指针调用free吗?或者我需要调用调用malloc的函数 面临的问题是,我们看到一个内存泄漏,因为这个分配指针的空闲时间直到日期才被编码。所以我现在的工作就是修复内存泄漏。您可以选择其中之一,但不能同时选择两者。对于设计来说,在分配内存的同一个函数中释放内存通常更好。严格来说,您可以在任何地方释放内存,只要您在最后一次使用后恰好释放一次内存。1

我有一个函数,其中malloc被用来分配一个指针,指针被传递到另一个函数,然后被传递到另一个函数,最后一次使用它

我的问题是,我能在最后一个函数中为分配的指针调用free吗?或者我需要调用调用malloc的函数


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

您可以选择其中之一,但不能同时选择两者。对于设计来说,在分配内存的同一个函数中释放内存通常更好。

严格来说,您可以在任何地方释放内存,只要您在最后一次使用后恰好释放一次内存。1百万美元的问题是,考虑到未来的使用,您如何轻松地实施这一点?传递具有所有权转移语义的指针通常是不好的。通常,使用分配传输返回指针也是不好的。如果设计了一个API,请考虑对被分配的对象进行抽象和分配/免费功能(如<代码> AlLoTeaTyWigGe< /COD>和<代码>免费控件>代码>。API的使用不应该知道
小部件
是用
malloc()
分配的,并且必须用
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.
}
或者,如果
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
变量值。 因此,如果您遇到内存泄漏,一个好的做法是在调用
free
后将指针变量设置为
NULL
。通过这种方式调试代码,您可以立即知道是否分配了内存(
ptr!=NULL
)或没有(
ptr==NULL


如果我将指针释放到分配的位置,返回的指针是否会变为空?我可能会指出,当您不再需要内存时,您必须释放内存。allocate-call函数-free。对,所以我需要在使用完之后释放它
if(ptr != NULL) 
{
    free(ptr);
    ptr = NULL;
}