<21> C程序引用外部资源模板
当需要引用外部资源的时候,按照如下规范处理,很大的解决了重复释放等问题。
1、引用资源的指针(或句柄)初值必须为错误值。
2、申请资源后,必须检查是否成功。
3、按照需求规定处理错误后,程序转移到退出流程。
4、使用资源。
5、释放资源前必须先检查指针或句柄是否有效。
6、释放资源后,必须将指针(或句柄)重置为无效值。
/******************************************************************
*资源的合理使用规范套路(与C++中的throw 语法一样,可见这是【语法糖】)
*******************************************************************/
EroorProc()
{
//错误处理函数
}
int main()
{
// 1) 引用资源的指针(或句柄)初始值为错误值
char* psz = NULL;
psz = (char*)malloc(10);
// 2) 申请资源后,必须检查是否成功
if (psz == NULL)
{
// 3) 按照需求规定处理错误后,程序转移到退出流程
ErrorProc();
goto EXIT_PROC;
}
// 4) 使用资源
EXIT_PROC:
// 5) 释放资源时,必须检查引用的资源是否有效
if (psz != NULL)
{
// 6) 释放资源后,必须将指针或引用重置为无效值
free(psz);
psz = NULL;
}
return 0;
}
多处资源引用示例(使用上面的模板)
include <stdlib.h>
include <stdio.h>
define SAFE_FREE(p) if(p!=NULL)
void ErrorProc()
{
}
int main(int argc,char* argv[])
{
// 1) 引用资源的指针(或句柄)初始值为错误值
//必须定义在最前面。目的:防止退出流程时造成资源的野指针释放。
char* pszA = NULL;
char* pszB1 = NULL;
char* pszB2 = NULL;
char* pszC = NULL;
pszA = (char*)malloc(10);
// 2) 申请资源后,必须检查是否成功
if (pszA == NULL)
{
// 3) 按照需求规定处理错误后,程序转移到退出流程
ErrorProc();
goto EXIT_PROC;
}
if (argc > 8)
{
pszB1 = (char*)malloc(10);
// 2) 申请资源后,必须检查是否成功
if (pszB1 == NULL)
{
// 3) 按照需求规定处理错误后,程序转移到退出流程
ErrorProc();
goto EXIT_PROC;
}
}
else
{
pszB2 = (char*)malloc(10);
// 2) 申请资源后,必须检查是否成功
if (pszB2 == NULL)
{
// 3) 按照需求规定处理错误后,程序转移到退出流程
ErrorProc();
goto EXIT_PROC;
}
}
/*
错误示范:当 B1 或 B2 出问题退出流程的时候,此时pszC还是系统的残留值,
如果这个值是很重要的,那么最后被释放了,很难想象会发生什么不可预测的事
*/
//char* pszC = (char*)malloc(10);
pszC = (char*)malloc(10);
// 2) 申请资源后,必须检查是否成功
if (pszC == NULL)
{
// 3) 按照需求规定处理错误后,程序转移到退出流程
ErrorProc();
goto EXIT_PROC;
}
// 4) 使用资源
EXIT_PROC:
//释放顺序:反向释放。因为先申请的堆不会依赖后申请的堆,后申请的堆可能依赖先申请的堆。
//因为C可能引用了B1或则B2的资源,所以最先释放。
//如果先释放B在释放C。当C引用了B的资源,B释放后,此时在释放C,可能找不到C的指针
SAFE_FREE(pszC);
SAFE_FREE(pszB1);
SAFE_FREE(pszB2);
if (pszA != NULL)
{
free(pszA);
pszA = NULL;
}
return 0;
}
goto 目前为止还存在的理由:
多层循环,直接跳出。
C语言环境下多资源的处理。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战