gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:02:55 25 4
gpt4 key购买 nike

一个函数(比如“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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com