欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言之free函數(shù)以及野指針介紹

 更新時(shí)間:2013年07月11日 11:07:32   作者:  
以下是對(duì)C語(yǔ)言中的free函數(shù)與野指針進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下

【FROM MSDN && 百科】
原型:void free(void *ptr);
#include<stdlib.h>或#include <malloc.h>
Deallocate space in memory
釋放ptr指向的存儲(chǔ)空間。被釋放的空間通常被送入可用存儲(chǔ)區(qū)池,以后可在調(diào)用malloc、realloc以及realloc函數(shù)來(lái)再分配。
注意:連續(xù)兩次使用free函數(shù),肯定會(huì)發(fā)生錯(cuò)誤。malloc的次數(shù)要和free的次數(shù)相等。
A block of memory previously allocated using a call to malloc, calloc or realloc is deallocated, making it available again for further allocations.
If ptr does not point to a block of memory allocated with the above functions, the behavior is undefined.
If ptr is a null pointer, the function does nothing
Notice that this function does not change the value of ptr itself, hence it still points to the same (now invalid) location
DEMO:

復(fù)制代碼 代碼如下:

//#define  FIRST_DEMO
#define  SECOND_DEMO
#ifdef FIRST_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
 int *buffer1,*buffer2,*buffer3;
 buffer1=(int *)malloc(100*sizeof(int));
 buffer2=(int *)calloc(100,sizeof(int));
 buffer3=(int *)realloc(buffer2,500*sizeof(int));
 free(buffer1);
 free(buffer3);
 getch();
 return 0;
}
#elif defined SECOND_DEMO
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int main(void)
{
 char *str;
 /*allocate memory for string*/
 str=(char *)malloc(10);
 if (str==NULL)
 {
  perror("malloc");
  abort();
 }
 else
 {
  /*copy "hello" to string*/
  strcpy(str,"hello");
  /*display string*/
  printf("String is %s\n",str);
  /*free memory*/
  free(str);
 }
 getch();
 return 0;
}
#endif

DEMO:perror
perror( ) 用來(lái)將上一個(gè)函數(shù)發(fā)生錯(cuò)誤的原因輸出到標(biāo)準(zhǔn)設(shè)備(stderr)。參數(shù) s 所指的字符串會(huì)先打印出,后面再加上錯(cuò)誤原因字符串。此錯(cuò)誤原因依照全局變量errno 的值來(lái)決定要輸出的字符串。
復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <stdlib.h>   //perror包含在此文件中
#include <conio.h>
int main(void)
{
    FILE *fp;
 fp=fopen("abc","r+");
 if (NULL == fp)
 {
  perror("abc");
 }
 getch();
 return 0;
}

output:
abc: No such file or directory
DEMO:
復(fù)制代碼 代碼如下:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
 char *ptr;
 ptr=(char *)malloc(100);
 strcpy(ptr,"Hello");
 free(ptr);    //<span style="font-family: arial, 宋體, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;">&nbsp;ptr 所指的內(nèi)存被釋放,但是ptr所指的地址仍然不變,原來(lái)的內(nèi)存變?yōu)椤袄眱?nèi)存(不可用內(nèi)存)</span>
#if 1
 if (ptr!=NULL)    /*<span style="font-family: arial, 宋體, sans-serif; font-size: 13.63636302947998px; line-height: 24px; text-indent: 30px;">&nbsp;沒(méi)有起到防錯(cuò)作用</span>*/
 {
  strcpy(ptr," world");
  printf("%s\n",ptr);
 }
#endif
 getch();
 return 0;
}

free(str)后指針仍然指向原來(lái)的堆地址,即你仍然可以繼續(xù)使用,但很危險(xiǎn),因?yàn)椴僮飨到y(tǒng)已經(jīng)認(rèn)為這塊內(nèi)存可以使用,他會(huì)毫不考慮的將他分配給其他程序,于是你下次使用的時(shí)候可能就已經(jīng)被別的程序改掉了,這種情況就叫“野指針”,所以最好free()了以后再置空
str = NULL;
即本程序已經(jīng)放棄再使用他。
何謂“野指針”,在這里補(bǔ)充一下。
野指針是指程序員或操作者不能控制的指針。野指針不是NULL指針,而是指向“垃圾”的指針。

造成“野指針”的原因主要有
1.指針變量沒(méi)有初始化,
任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的缺省值是隨機(jī)的,它會(huì)亂指一氣。在初始化的時(shí)候要么指向合法的指針,要么指向NULL。

2.指針變量被free或delete之后,沒(méi)有設(shè)置為NULL。它們只是把指針?biāo)傅膬?nèi)存給釋放掉,但并沒(méi)有把指針本身干掉。通常會(huì)用語(yǔ)句if (p != NULL)進(jìn)行防錯(cuò)處理。很遺憾,此時(shí)if語(yǔ)句起不到防錯(cuò)作用,因?yàn)榧幢鉷不是NULL指針,它也不指向合法的內(nèi)存塊。上文DEMO則是這種情況。

3.指針操作超越了變量的作用范圍。注意其生命周期。

【下面是摘自論壇里面的形象比喻,加深理解?!?BR>CRT的內(nèi)存管理模塊是一個(gè)管家。  
你的程序(簡(jiǎn)稱(chēng)“你”)是一個(gè)客人。  
管家有很對(duì)水桶,可以用來(lái)裝水的。  
malloc的意思就是“管家,我要XX個(gè)水桶”。  
管家首先看一下有沒(méi)有足夠的水桶給你,如果沒(méi)有,那么告訴你不行。如果夠,那么登記這些水桶已經(jīng)被使用了,然后告訴你“拿去用吧”。  
free的意思就是說(shuō):“管家我用完了,還你!”。  
至于你是不是先把水倒干凈才給管家,那么是自己的事情了。--是不是清零。
  
管家也不會(huì)將你歸還的水桶倒倒干清(他有那么多水桶,每個(gè)歸還都倒干凈豈不累死了)。反正其他用的時(shí)候自己會(huì)處理的啦。  
free之后將指針清零只是提醒自己,這些水桶已經(jīng)不是我的了,不要再完里面放水了,^_^  
如果free了之后還用那個(gè)指針的話(huà),就有可能管家已經(jīng)將這些水桶給了其他人裝飲料的了,你卻往里面撒了泡尿。好的管家可能會(huì)對(duì)你的行為表示強(qiáng)烈的不滿(mǎn), 殺了你(非法操作)--這是最好的結(jié)果,你知道自己錯(cuò)了(有錯(cuò)就改嘛)。一些不好的管家可能忙不過(guò)來(lái),有時(shí)候抓到你作壞事就懲罰你,有時(shí)候卻不知道去那里 了--這是你的惡夢(mèng),不知道什么時(shí)候、怎么回事情自己就死了。不管怎么樣,這種情況下很有可能有人要喝尿--不知道是你的老板還是你的客戶(hù)了.^_^。  
所以啊,好市民當(dāng)然是還了給管家的東西就不要再占著啦,.^_^。

相關(guān)文章

  • [c++]變量聲明與定義的規(guī)則詳解

    [c++]變量聲明與定義的規(guī)則詳解

    這篇文章主要介紹了[c++]變量聲明與定義的規(guī)則詳解,對(duì)于學(xué)習(xí)c++的朋友來(lái)說(shuō)這是一個(gè)很細(xì)膩的文章,代碼完整,需要的朋友可以參考下
    2021-04-04
  • C語(yǔ)言數(shù)組的各種操作梳理

    C語(yǔ)言數(shù)組的各種操作梳理

    數(shù)組是一組有序的數(shù)據(jù)的集合,數(shù)組中元素類(lèi)型相同,由數(shù)組名和下標(biāo)唯一地確定,數(shù)組中數(shù)據(jù)不僅數(shù)據(jù)類(lèi)型相同,而且在計(jì)算機(jī)內(nèi)存里連續(xù)存放,地址編號(hào)最低的存儲(chǔ)單元存放數(shù)組的起始元素,地址編號(hào)最高的存儲(chǔ)單元存放數(shù)組的最后一個(gè)元素
    2022-04-04
  • C++學(xué)習(xí)之Lambda表達(dá)式的用法詳解

    C++學(xué)習(xí)之Lambda表達(dá)式的用法詳解

    Lambda?表達(dá)式(lambda?expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名。本文就來(lái)為大家詳細(xì)講講C++中Lambda表達(dá)式的使用,需要的可以參考一下
    2022-07-07
  • C++類(lèi)型轉(zhuǎn)換運(yùn)算符的實(shí)例詳解

    C++類(lèi)型轉(zhuǎn)換運(yùn)算符的實(shí)例詳解

    這篇文章主要介紹了C++類(lèi)型轉(zhuǎn)換運(yùn)算符的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文大家能夠掌握這部分內(nèi)容,需要的朋友可以參考下
    2017-09-09
  • C++中atof?函數(shù)的介紹

    C++中atof?函數(shù)的介紹

    這篇文章主要給大家分享的是C++中atof?函數(shù)的介紹,在?stdlib.h?中?atof?函數(shù),可用于將?char?字符串轉(zhuǎn)為?float?/?double?浮點(diǎn)數(shù)類(lèi)型,想具體了解語(yǔ)法的小伙伴可以參考下面文章的內(nèi)容,希望對(duì)大家有所幫助
    2021-11-11
  • C++實(shí)現(xiàn)簡(jiǎn)單推箱子小游戲

    C++實(shí)現(xiàn)簡(jiǎn)單推箱子小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡(jiǎn)單推箱子小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • C++進(jìn)一步認(rèn)識(shí)類(lèi)與對(duì)象

    C++進(jìn)一步認(rèn)識(shí)類(lèi)與對(duì)象

    類(lèi)是創(chuàng)建對(duì)象的模板,一個(gè)類(lèi)可以創(chuàng)建多個(gè)對(duì)象,每個(gè)對(duì)象都是類(lèi)類(lèi)型的一個(gè)變量;創(chuàng)建對(duì)象的過(guò)程也叫類(lèi)的實(shí)例化。每個(gè)對(duì)象都是類(lèi)的一個(gè)具體實(shí)例(Instance),擁有類(lèi)的成員變量和成員函數(shù)
    2021-10-10
  • Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法

    Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法

    這篇文章主要介紹了Qt QChart 創(chuàng)建圖表的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • C++實(shí)現(xiàn)圖書(shū)管理程序

    C++實(shí)現(xiàn)圖書(shū)管理程序

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書(shū)管理程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C語(yǔ)言中字符串常用操作總結(jié)

    C語(yǔ)言中字符串常用操作總結(jié)

    C語(yǔ)言是一種非常流行的編程語(yǔ)言,它支持各種數(shù)據(jù)類(lèi)型,包括整數(shù)、浮點(diǎn)數(shù)、字符和字符串等,本文將介紹?C語(yǔ)言中字符串的相關(guān)知識(shí),包括字符串的定義、初始化、賦值等,需要的可以參考一下
    2023-05-05

最新評(píng)論