当前位置: 首页 > backend >正文

C/C++语言中成双成对出现的都有哪些?

比如open()和close(),malloc()和free(),new()和delete()

在C/C++语言中,许多函数和操作需要成对使用以确保资源的正确分配和释放。以下是常见的成对出现的函数和操作:

  1. 文件操作
    C语言:
    fopen() 和 fclose():打开和关闭文件1。
    freopen() 和 fclose():重新打开文件并关闭原文件流1。
    C++:
    std::fstream 的构造函数和析构函数:自动管理文件打开和关闭(RAII机制)7。
  2. 动态内存管理
    C语言:
    malloc() / calloc() 和 free():分配和释放堆内存25。
    realloc() 和 free():调整内存大小后仍需手动释放5。
    C++:
    new 和 delete:分配和释放单个对象38。
    new[] 和 delete[]:分配和释放数组38。
    operator new 和 operator delete:自定义内存分配与释放9。
  3. 资源管理(RAII相关)
    C++智能指针:
    std::make_unique 和 std::unique_ptr 的析构函数:自动释放独占资源9。
    std::make_shared 和 std::shared_ptr 的析构函数:自动释放共享资源9。
    std::weak_ptr 需与 std::shared_ptr 配合使用9。
  4. 线程与锁
    C++:
    std::mutex::lock() 和 std::mutex::unlock():手动加锁与解锁7。
    std::lock_guard 或 std::unique_lock 的构造函数和析构函数:自动加锁与解锁(RAII)7。
  5. 其他系统资源
    C语言:
    opendir() 和 closedir():打开和关闭目录流。
    socket() 和 closesocket()(Windows) / close()(Unix):创建和关闭套接字。
    C++:
    自定义RAII类:构造函数分配资源,析构函数释放资源(如数据库连接、图形句柄等)7。
    注意事项
    不匹配的后果:
    混用 malloc() 和 delete 或 new 和 free() 会导致未定义行为58。
    数组分配必须使用 delete[],否则可能泄漏内存或崩溃3。
    现代C++推荐:
    优先使用智能指针(如 std::unique_ptr)和容器(如 std::vector)替代显式的 new/delete97。
    如果需要更完整的列表或具体场景的示例,可以参考C/C++标准库文档或相关编程指南。

问题:如果申请失败呢

举例1:

main_Fd = open("/sys/bus/platform/drivers/xxxxx/main_cam_sn", O_RDONLY);
if (main_Fd < 0)
{//close(main_Fd);CAMX_LOG_ERROR(CamxLogGroupCSL, "No main_cam_sn found");
}
else 
{xxxxclose(main_Fd);
}

在 open 函数调用失败时(即返回值为负数,通常为 -1),不需要调用 close 函数关闭文件描述符。
在 open 函数调用失败时(即返回值为负数,通常为 -1),不需要调用 close 函数关闭文件描述符。以下是详细解释和注意事项:

  1. open 失败时文件描述符无效
    当 open 失败时,返回值是 -1,表示没有有效的文件描述符被分配。此时 main_Fd 的值为 -1,而 close(-1) 是无效操作,甚至可能导致未定义行为或错误。
    系统调用 close 的规范明确指出,只有非负整数(有效的文件描述符)才能作为参数传递。传递 -1 可能触发错误(如 EBADF,表示无效的文件描述符)。
  2. 代码逻辑修正建议
  3. 错误处理的最佳实践
    检查返回值:始终检查 open 的返回值,避免对无效描述符操作。
    错误日志:你的代码中已正确记录错误日志(CAMX_LOG_ERROR),这是推荐的做法。
    资源释放:仅释放已成功分配的资源(如文件描述符、内存等)。
  4. 为什么不需要 close(-1)?
    系统内部的文件描述符表通过非负整数索引,负数是保留值或错误标志。close 的设计初衷是释放资源,而无效描述符无资源可释放。
    总结
    在 open 失败时,直接跳过 close 调用即可。强制关闭无效描述符可能引入额外问题,且无实际意义。正确的做法是仅在成功获取文件描述符后,在适当的位置(如使用完毕后或程序退出前)调用 close

问题:其他组的呢,是不是也是仅释放已成功分配的资源。

http://www.xdnf.cn/news/9079.html

相关文章:

  • STM32程序运行不了,仿真功能也异常,连断点和复位都异常了
  • 网络流学习笔记(基础)
  • Beckhoff PLC 功能块 FB_CTRL_ACTUAL_VALUE_FILTER (模拟量滤波)
  • vSphere 7.0 client 提示HTTP状态 500- 内部服务器错误
  • GROUP BY SQL
  • 【动态规划】子数组系列(一)
  • 【备战秋招】C++音视频开发经典面试题整理
  • 学校住宿管理系统——仙盟创梦IDE
  • OpenGL Chan视频学习-7 How I Deal with Shaders in OpenGL
  • 0基础学习Linux之揭开朦胧一面:环境基础开发工具
  • java8函数式接口(函数式接口的匿名实现类作为某些方法的入参)
  • 2025年5月系统架构设计师考试真题回忆版
  • 7.安卓逆向2-frida hook技术-介绍
  • 重学计算机网络之命令整理
  • 数据加密技术:守护网络通信安全的基石
  • ceph 报错 full ratio(s) out of order
  • Elasticsearch数据同步方案
  • VS Code设置Dev Containers: Reopen in Container
  • MongoDB基础知识(浅显)
  • docker compose yml 启动的容器中,如何使用linux环境变量赋值
  • Python 进阶学习
  • [CSS3]rem移动适配
  • *HTML `<script>` 标签中的核心属性解析:掌控脚本加载与执行的艺术
  • 力扣HOT100之回溯:79. 单词搜索
  • 常见小问题(Open Folder as PyCharm Project)
  • Veeam Backup 13 beta ui 方式备份 VMware esxi 虚拟机
  • 报错:ImportError: cannot import name ‘metadata‘ from ‘importlib‘
  • springboot启动流程
  • Golang 的协程调度小结
  • Java-synchronized学习总结