释放从 C 函数返回的内存

2024-03-03

在 C 中,在释放函数返回的内存时,这是更好的做法:

  • 提供一个“析构函数”来封装对 free() 的调用。
  • 要求用户自己 free() 返回的指针。

例如,要打开和关闭文件,我们执行以下操作:

FILE* f = fopen("blah", "w");
fclose(f);

这是否优于:

FILE* f = fopen("blah", "w");
fclose(f);
free(f);

Warning:不要对 FILE 指针调用 free()。我在这里仅使用它作为假设的实现。

那么局部变量指向返回的内存的情况又如何呢? free() 这里有害吗? (或者也许永远不应该这样做)

FILE f = &fopen("blah", "w");
fclose(&f);

分配和释放内存的最佳选择是对称进行。即,如果调用者分配了内存,则让调用者释放它。如果您的 API 分配了内存(被调用者),那么您的 API 应该释放它。

调用者分配/释放的示例:

int * mymem = (int *)malloc(20 * sizeof(int));
...
a_func_to_call(mymem);
...
free(mymem);

被调用者分配/释放的示例:

FILE* f = fopen("blah", "w"); // allocs a FILE struct
fclose(f); // The implementation of fclose() will do what's necessary to 
           // free resources and if it chooses to deallocate any memory
           // previously allocated
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

释放从 C 函数返回的内存 的相关文章

随机推荐

  • WPF/DataGrid:绑定到不同的属性以进行显示和编辑

    我有一个对象 其中包含例如 10 20 30 之类的字符串属性 我还有一个 get 属性 用于分割字符串 将每个部分转换为双精度型并将它们相加 因此我有 10 20 30 和60 0 双倍 现在的问题是 有没有办法在 TextColumn
  • 作为 Windows 服务的 node.js http 服务器

    我在 Node js 中创建了一个简单的 http 服务器 我想让它在我的 Windows 2008 计算机上永久运行 这样 如果计算机重新启动 它会自动重新启动 所以我用这个命令把它变成了一个服务 C Users Administrato
  • 有没有查看/编辑/删除Marklogic文档的工具

    有没有什么工具可以view edit deleteMarklogic 的文档 比如 Mongo Management Studio for MongoDb MarkLogic 内置了对 WebDav 的支持 您可以在管理控制台中创建 Web
  • Android双向数据绑定,textview不更新

    我正在尝试将 MVVM 模式与 android 数据绑定一起使用 我有一个 edittext 和一个 textview 当我通过使用 LocationType 模型对象通过 observablefield 绑定到模型来在 edittext
  • Sparklyr/Hive:如何正确使用正则表达式(regexp_replace)?

    考虑下面的例子 dataframe test lt data frame mydate c 2011 03 01T00 00 04 226Z 2011 03 01T00 00 04 226Z A tibble 2 x 1 mydate
  • 如何执行任务以避免用户被迫等待响应?

    用户创建新产品后 在我的应用程序中 我执行多项操作 例如更新几个表 统计数据 财务 使用情况 库存等 现在用户必须等待我完成所有步骤 如果很多用户托盘同时执行此操作 则等待时间会更长 这不太好 我的计划是创建一个特殊的 TASK TABLE
  • 从同级目录导入

    我有一个名为 ClassA 的Python 类和另一个Python 类 该类应该导入ClassA 即 ClassB 目录结构如下 MainDir Dir DirA ClassA DirB ClassB 我将如何使用sys path那么Cla
  • 从子视图将 Javascript 文件附加到 InlineScript 集合的末尾

    我正在使用 Zend Framework 2 在我的布局文件中 我注入了一些像这样的 javascript 文件 this gt InlineScript gt appendFile this gt basePath js myfile j
  • ASP .NET MVC 保护控制器/操作

    如果我只想管理员访问名为 ManagerUser 的操作 我知道我可以这样做 Authorize Roles Constants ROLES ADMINISTRATOR public ActionResult ManageUser stri
  • Tomcat Maven 插件 - 子容器在启动期间失败

    我正在开发一个多模块 Maven 项目 我想在 Tomcat 7 中运行我的 Web 项目 但出现此错误 子容器在启动期间失败 我继续 右键单击网络项目 gt 运行方式 gt 运行配置 gt 目标 tomcat7 run 我有这个日志 av
  • 数据表自动切换页面

    我正在尝试自动在数据表页面之间切换 但似乎无法使其正常工作 我要么得到一个长时间运行的脚本 如果我尝试添加延迟 则会收到以下错误 table page draw delay 不是函数 下面是我正在使用的代码 document ready f
  • 反斜杠字符的 Bash 参数扩展规则

    我有一个变量 我想使用双反斜杠 替换每次出现的反斜杠 外壳参数扩展 https www gnu org software bash manual html node Shell Parameter Expansion html 最初 我使用
  • 从子目录中的不同文件导入类

    这是我正在使用的结构 directory script py subdir init py myclass01 py myclass02 py 我想要做的是在 script py 中导入定义的类myclass01 py and myclas
  • 展平 pandas 中的嵌套 json

    我收到了 JSON 格式的天气观测数据 我想将其展平 一份完整记录 第一个位置包含 25 个报告 Rep in Period SiteRep DV type Obs Location i 3002 lat 60 749 lon 0 854
  • 有什么方法可以更改 VSTO Outlook 添加中的自定义任务窗格颜色吗?

    有没有办法更改邮件撰写窗口中的自定义任务窗格背景颜色 UPDATE UserControl BackColor 给了我这个结果 但我希望整个自定义任务窗格是白色的 我设置用户控件的代码在这里 public partial class Use
  • 如何使用 C++ ShellExecute 命令在特定页面或指定目的地打开 PDF

    我正在尝试打开一个 pdf在特定的指定目的地使用ShellExecute 但我不知道参数应该如何格式化 我这里使用的参数是pagew 以前有人尝试过这个吗 我找到了几个答案 但它们对我的需要没有帮助 PS 只打开 pdf工作正常 int m
  • “您需要将 Theme.AppCompat 主题(或后代)与设计库一起使用”错误

    每次我都会收到 您需要将 Theme AppCompat 主题 或后代 与设计库一起使用 错误 即使我显然使用的是 AppCompat 主题 后代主题 依赖项 compile com android support appcompat v7
  • 在 C# 中使用私钥对数据进行签名

    我需要使用算法 SHA1RSA Rsa 密钥长度 2048 和 64 基本编码 用一个私钥对一些数据进行签名 我的代码是这样的 string sPayload HttpWebRequest httpWebRequest HttpWebReq
  • 如何从 R 矩阵中随机选择重复的行样本?

    如何从 R 矩阵中随机选择重复的行样本 所以请明确一点 我将从一个 100 行的矩阵开始 我可以选择其中 5 行并创建一个新矩阵 我希望可以选择在更换或不更换的情况下执行此操作 Use sample在行上replace TRUE or re
  • 释放从 C 函数返回的内存

    在 C 中 在释放函数返回的内存时 这是更好的做法 提供一个 析构函数 来封装对 free 的调用 要求用户自己 free 返回的指针 例如 要打开和关闭文件 我们执行以下操作 FILE f fopen blah w fclose f 这是