程序运行结束了,申请的每个资源,会自动回收吗?该怎么处理

程序运行结束了,申请的每个资源,会自动回收吗?
/*
资源泄漏是代码Review中最常见的错误之一

申请的每个资源必须明确由谁负责释放,何时释放,在何处释放;

在异常分支中,保持清醒的头脑,清理战场;

在特定功能去使能时,需要完成的主要工作就是资源清退;
*/

void PrintDigit(unsigned long ulData)
{
char *pBuf = (char *)malloc(16);
if (NULL == pBuf)
{
return;
}

sprintf(pBuf, "%lu\n\r", ulData);
printf(pBuf);
free(pBuf); //Review九句箴言:看见Malloc找Free!
pBuf = NULL; //Free指针后给指针置空是个非常好的习惯
return;
}

Node_Head_S* CreateNode(ULONG ulNType)
{
Node_Head_S *pNode;
Node_Body_S *pBody;

pNode = (Node_Head_S *)malloc(sizeof(Node_Head_S));
if (NULL == pNode)
{
return NULL;
}
pBody = (Node_Body_S *)malloc(sizeof(Node_Body_S));
if (NULL == pBody)
{
Free(pNode); //异常分支最容易忘记打扫战场,顾头也要顾尾
return NULL;
}
pNode->pBody = pBody;
pNode->ulNType = ulNType;
return pNode;
}

------解决方案--------------------
在进程运行时,进程有可能泄漏资源(如内核对象) 。但是,当进程终止运行时,操作
系统能够确保该进程使用的任何资源或全部资源均被释放,这是有保证的。——《Windows核心编程》