<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语言环境下多资源的处理。

posted @   kksllss  阅读(0)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示