C/C++语言中成双成对出现的都有哪些?
比如open()和close(),malloc()和free(),new()和delete()
在C/C++语言中,许多函数和操作需要成对使用以确保资源的正确分配和释放。以下是常见的成对出现的函数和操作:
- 文件操作
C语言:
fopen() 和 fclose():打开和关闭文件1。
freopen() 和 fclose():重新打开文件并关闭原文件流1。
C++:
std::fstream 的构造函数和析构函数:自动管理文件打开和关闭(RAII机制)7。 - 动态内存管理
C语言:
malloc() / calloc() 和 free():分配和释放堆内存25。
realloc() 和 free():调整内存大小后仍需手动释放5。
C++:
new 和 delete:分配和释放单个对象38。
new[] 和 delete[]:分配和释放数组38。
operator new 和 operator delete:自定义内存分配与释放9。 - 资源管理(RAII相关)
C++智能指针:
std::make_unique 和 std::unique_ptr 的析构函数:自动释放独占资源9。
std::make_shared 和 std::shared_ptr 的析构函数:自动释放共享资源9。
std::weak_ptr 需与 std::shared_ptr 配合使用9。 - 线程与锁
C++:
std::mutex::lock() 和 std::mutex::unlock():手动加锁与解锁7。
std::lock_guard 或 std::unique_lock 的构造函数和析构函数:自动加锁与解锁(RAII)7。 - 其他系统资源
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 函数关闭文件描述符。以下是详细解释和注意事项:
- open 失败时文件描述符无效
当 open 失败时,返回值是 -1,表示没有有效的文件描述符被分配。此时 main_Fd 的值为 -1,而 close(-1) 是无效操作,甚至可能导致未定义行为或错误。
系统调用 close 的规范明确指出,只有非负整数(有效的文件描述符)才能作为参数传递。传递 -1 可能触发错误(如 EBADF,表示无效的文件描述符)。 - 代码逻辑修正建议
- 错误处理的最佳实践
检查返回值:始终检查 open 的返回值,避免对无效描述符操作。
错误日志:你的代码中已正确记录错误日志(CAMX_LOG_ERROR),这是推荐的做法。
资源释放:仅释放已成功分配的资源(如文件描述符、内存等)。 - 为什么不需要 close(-1)?
系统内部的文件描述符表通过非负整数索引,负数是保留值或错误标志。close 的设计初衷是释放资源,而无效描述符无资源可释放。
总结
在 open 失败时,直接跳过 close 调用即可。强制关闭无效描述符可能引入额外问题,且无实际意义。正确的做法是仅在成功获取文件描述符后,在适当的位置(如使用完毕后或程序退出前)调用 close