如果不適用free釋放內(nèi)存,會(huì)造成內(nèi)存泄露。隨著程序的運(yùn)行,程序所占內(nèi)存越來越多,知道系統(tǒng)奔潰或者程序結(jié)束。
成都創(chuàng)新互聯(lián)公司主要從事網(wǎng)頁設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、成都響應(yīng)式網(wǎng)站建設(shè)、程序開發(fā)、網(wǎng)站優(yōu)化、微網(wǎng)站、重慶小程序開發(fā)等,憑借多年來在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了豐富的成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營銷、管理等多方位專業(yè)化運(yùn)作于一體。
1、free函數(shù):
原型:void free(void *ptr);
功能:釋放malloc(或calloc、realloc)函數(shù)給指針變量分配的動(dòng)態(tài)內(nèi)存;
頭文件:malloc.h或stdlib.h;
2、為了避免釋放已經(jīng)釋放了內(nèi)存的指針內(nèi)存,或沒有釋放內(nèi)存,在C語言中最好是在定義指針時(shí)賦初值NULL,釋放后立即賦NULL,釋放時(shí)檢查指針值再?zèng)Q定釋放就避免釋放錯(cuò)誤了,例如:
int *a = NULL
int *b = (int*) malloc(sizeof(int) * 10);
a= b;
/* 執(zhí)行大量操作后 */
if(a != NULL) {free(a);a=NULL;}
if(b != NULL) {free(b);b=NULL;}
因?yàn)閒ree函數(shù)僅僅是告訴操作系統(tǒng),這一塊內(nèi)存被釋放了,可以用來作其它用途。但是,由于你沒有重新對(duì)這塊內(nèi)存進(jìn)行寫操作,所以內(nèi)存中的變量數(shù)值并沒有發(fā)生變化。所以輸出值不變。
通常建議,將這個(gè)p用完了也置NULL
不可以的。
malloc, alloc, free是c定義的一組內(nèi)存管理的API函數(shù),當(dāng)你調(diào)用malloc、alloc分配內(nèi)存時(shí),不僅僅是從堆里面分配得到了可用內(nèi)存,實(shí)際上內(nèi)存管理子系統(tǒng)還會(huì)維護(hù)了內(nèi)存列表。你自己定義的指針不會(huì)在這個(gè)列表中的,所以free會(huì)出問題的。
那么,使用new, GlobalAlloc之類的方式分配的內(nèi)存可不可以使用free呢。我的回答是,盡量不要,大部分情況都會(huì)帶來風(fēng)險(xiǎn)。這里面涉及new, malloc, GlobalAlloc, HeapAlloc, LocalAlloc,VirtualAlloc等函數(shù)的區(qū)別。
還可以參考
=============
釋放內(nèi)存 free 函數(shù)
需要包含頭文件(和 malloc 一樣):
#include
或
#include
函數(shù)聲明:
void free(void *block);
即: void free(指針變量);
之所以把形參中的指針聲明為 void* ,是因?yàn)閒ree必須可以釋放任意類型的指針,而任意類型的指針都可以轉(zhuǎn)換為void *。
舉例:
int* p = (int *) malloc(4);
*p = 100;
free(p); //釋放 p 所指的內(nèi)存空間
或者:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個(gè)整數(shù)的內(nèi)存空間。
……
free(p);
free 不管你的指針指向多大的空間,均可以正確地進(jìn)行釋放,這一點(diǎn)釋放比 delete/delete [] 要方便。不過,必須注意,如果你在分配指針時(shí),用的是new或new[],那么抱歉,當(dāng)你在釋放內(nèi)存時(shí),你并不能圖方便而使用free來釋放。反過來,你用malloc 分配的內(nèi)存,也不能用delete/delete[] 來釋放。一句話,new/delete、new[]/delete[]、malloc/free 三對(duì)均需配套使用,不可混用!
int* p = new int[100];
... ...
free(p); //ERROR! p 是由new 所得。
功
能:
與malloc()函數(shù)配對(duì)使用,釋放malloc函數(shù)申請(qǐng)的動(dòng)態(tài)內(nèi)存。(另:如果p
是NULL
指針,那么free
對(duì)p
無論操作多少次都不會(huì)出問題。如果p
不是NULL
指針,那么free
對(duì)p連續(xù)操作兩次就會(huì)導(dǎo)致程序運(yùn)行錯(cuò)誤。)
用
法:
void
free(void
*ptr);
程序例:
#include
#include
#include
//or
#include
int
main(void)
{
char
*str;
/*
allocate
memory
for
string
*/
str
=
(char
*)malloc(10);
/*
copy
"Hello"
to
string
*/
strcpy(str,
"Hello");
/*
display
string
*/
printf("String
is
%s\n",
str);
/*
free
memory
*/
free(str);
return
0;
}
這樣可以么?
free(q); 釋放q指針?biāo)鶕碛械馁Y源,告訴系統(tǒng),本程序不再使用該內(nèi)存地址(free的功能就是這個(gè))
q=q-next; 然后繼續(xù)引用該地址,則程序可能會(huì)死掉!