c++ - 释放调用者或被调用者的内存?

标签 c++ memory-management memory-leaks

一个函数(比如“fun()”)分配内存并返回指向已分配内存的指针。 我应该如何确保释放此内存。当它返回给调用者时,我无法在函数“fun()”中立即释放它。 如果 fun() 是库的一部分怎么办?释放内存是谁的责任。 在 fopen() 的情况下,内存由 fclose() 释放。但就我而言,“fun()”被反复调用。所以我迫不及待地释放内存。

最佳答案

以下是 C 的答案,在 OP 承认使用 C++ 之前发布。在该语言中,按照其他人的建议使用 RAII 和智能指针。

如果函数返回分配的内存,则调用者负责释放,这必须在函数的文档中说明。

如果需要更多的清理,那么 free 会提供,或者在未来的库版本中可能需要这样的清理,那么你应该提供一个清理函数(比如 stdio code> 与执行释放的 fclose) 一起执行。如果您无法预测将来是否需要进行额外的清理,那么最好假设它会在某个时候进行。包装 免费 很便宜。

将其视为一种对称形式:如果客户端从库中获取资源(对象),则它最终负责将其交还给库进行处理:

void use_the_foo_library()
{
    Foo *f = make_foo();
    if (f == NULL)
        ERROR();

    foo_do_bar(f);
    foo_do_baz(f);

    foo_destroy(f);
}

在 foolib 1.0 中,foo_destroy 就是

void foo_destroy(Foo *p)
{
    free(p);
}

但在2.0版本中,它可能已经成长为

void foo_destroy(Foo *p)
{
    fclose(p->logfile);
    free(p);
}

等这种风格与opaque pointer一致设计模式。它还使您可以随时使用专用内存分配器(例如 pool allocator)替换 mallocfree。 ,无需更改任何客户端代码。

关于c++ - 释放调用者或被调用者的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7739323/

相关文章:

c++ - 无法使用 SWIG 将 QString 从 C++ 函数返回到 PERL 函数

c++ - 可变参数模板函数参数包的过滤

预处理器宏代码生成的 C++ 替代方案?

Android Media Player 挂起或返回 null

c# picturebox内存释放问题

jquery - 为什么 IE 在将 HTML 响应包装在 jQuery 对象中时会泄漏内存?

c++ - 从 QtProcess 运行时向 Linux 二进制文件提供参数

c - 如何在 MASM 中使用 pop 和 ret

java - 在退出时清理程序并处理 GC

xcode - AVAudioPlayer 和 SKAction.playSoundFileNamed(...) 导致内存泄漏