#include<stdio.h>
#include<stdlib.h>
/**Say hello to the user's and put the user's name in UPPERCASE.*/
void SayHi(char*name)
{
char* UpName;
int a;
UpName=malloc(strlen(name)+1);
/*Allocate space for the name*/
for(a=0;a<strlen(name);++a)
UpName[a]=toupper(name[a]);
UpName[a]='\0'i
printf("Hello,%si\n",UpName);
}
int main()
{
SayHi("Dave");
return(0);
}
這段程序中的問題是顯而易見的——它為存儲(chǔ)使用大寫字母的名字分配了臨時(shí)空間,但從
未釋放這些空間。為了保證永遠(yuǎn)不發(fā)生類似的情況,你可以采用這樣的方法:在分配內(nèi)存
的每條語句后加上相應(yīng)的free語句,然后把使用這些臨時(shí)內(nèi)存的語句插到這兩條語句之間。
只要在程序中分配和釋放內(nèi)存的語句之間沒有break,continue或goto語句,這種方法就
能保證每次分配的空間在使用完后就被釋放掉。上述方法相當(dāng)繁瑣,并且不能完全避免內(nèi)
存漏洞的出現(xiàn),因?yàn)樵趯?shí)際編程中,所分配的內(nèi)存空間的使用時(shí)間往往是不能預(yù)測的。此
外,如果操作或刪除內(nèi)存空間的程序段有錯(cuò)誤,也會(huì)出現(xiàn)內(nèi)存漏洞。例如,在刪除鏈表的
過程中,最后一個(gè)結(jié)點(diǎn)可能會(huì)丟失,或者一個(gè)指向內(nèi)存空間的指針可能會(huì)被改寫。解決這
類問題的辦法只能是小心謹(jǐn)慎地編寫程序,或者象前面提到的那樣使用相應(yīng)的軟件包,或
者利用語言的擴(kuò)展功能。