C指針(3):動態(tài)內存

動態(tài)內存

1.內存泄漏

如果不再使用已分配的內存卻沒有將其釋放就會發(fā)生內存泄漏

  • 丟失內存地址: 同一個指針被malloc()函數(shù)多次賦值導致之前的賦值的內存地址丟失; 指針賦值為null導致內存地址丟失
  • 隱式內存泄漏

2.動態(tài)內存分配函數(shù)

//malloc函數(shù)原型
void* malloc(size_t);
//如果malloc的參數(shù)是0测蘑,其行為是實現(xiàn)相關的:可能返回NULL指針仿荆,也可能返回一個指向分配了0字節(jié)區(qū)域的指針山涡。
//如果malloc函數(shù)的參數(shù)是NULL,那么一般會生成一個警告然后返回0字節(jié)

//當malloc無法分配內存時會返回NULL昔头,在使用它返回的指針之前先檢查NULL是不錯的做法
int *pi = (int*) malloc(sizeof(int));
if(pi != NULL) {    
    // 指針沒有問題
} else {   
    //無效指針
}

//初始化靜態(tài)或全局變量時不能調用函數(shù)
static int *pi;
pi = malloc(sizeof(int));

//calloc在分配的同時清空內存將內容置為0
void *calloc(size_t numElements, size_t elementSize);

//用malloc函數(shù)和memset函數(shù)可以得到同樣的結果
/*
memset函數(shù)會用某個值填充內存塊涨薪。
第一個參數(shù)是指向要填充的緩沖區(qū)的指針辈赋,
第二個參數(shù)是填充緩沖區(qū)的值慌烧,
第三個參數(shù)是要填充的字節(jié)數(shù)
*/
int *pi = malloc(5 * sizeof(int));
memset(pi, 0, 5* sizeof(int))
    
//realloc函數(shù)會重新分配內存,第一個參數(shù)是指向原內存塊的指針逐抑,第二個是請求的大小
void *realloc(void *ptr, size_t size);

//free函數(shù)
void free(void *ptr);

3.迷途指針

指針指向的地址已被釋放,但指針仍在引用原始內存的指針,成為迷途指針

int *p1 = (int*) malloc(sizeof(int));
*p1 = 5;
int *p2;
p2 = p1;
free(p1);
//p1,p2成為迷途指針

int *pi;
...
{    
    int tmp = 5;
    pi = &tmp;
}// 這里pi變成了迷途指針
foo();

//處理方法
//釋放指針后置為NULL,后續(xù)使用這個指針會終止程序.
//有些系統(tǒng)(運行時或調試系統(tǒng))會在釋放后覆寫數(shù)據.在不拋出異常的情況下,如果程序員在預期之外的地方看到這些值屹蚊,可以認為程序可能在訪問已釋放的內存
//用第三方工具檢測迷途指針和其他問題

4.垃圾回收

  • 資源獲取即初始化(Resource Acquisition Is Initialization厕氨,RAII): 即使有異常發(fā)生,這種技術也能保證資源的初始化和后續(xù)的釋放汹粤。分配的資源最終總是會得到釋放

  • 異常處理函數(shù): try塊包含任何可能在運行時拋出異常的語句腐巢。不管有沒有異常拋出,都會執(zhí)行finally塊玄括,因此也一定會執(zhí)行free函數(shù)

    void exceptionExample() { 
        int *pi = NULL;
        __try {       
            pi = (int*)malloc(sizeof(int));
            *pi = 5;        
            printf("%d\n",*pi);
        }   
        __finally { 
            free(pi);   
        }
    
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市肉瓦,隨后出現(xiàn)的幾起案子遭京,更是在濱河造成了極大的恐慌,老刑警劉巖泞莉,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哪雕,死亡現(xiàn)場離奇詭異,居然都是意外死亡鲫趁,警方通過查閱死者的電腦和手機斯嚎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挨厚,“玉大人堡僻,你說我怎么就攤上這事∫咛辏” “怎么了钉疫?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長巢价。 經常有香客問我牲阁,道長固阁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任城菊,我火速辦了婚禮备燃,結果婚禮上,老公的妹妹穿的比我還像新娘凌唬。我一直安慰自己并齐,他們只是感情好,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布法瑟。 她就那樣靜靜地躺著冀膝,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霎挟。 梳的紋絲不亂的頭發(fā)上窝剖,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天,我揣著相機與錄音酥夭,去河邊找鬼赐纱。 笑死,一個胖子當著我的面吹牛熬北,可吹牛的內容都是我干的疙描。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼讶隐,長吁一口氣:“原來是場噩夢啊……” “哼起胰!你這毒婦竟也來了?” 一聲冷哼從身側響起巫延,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤效五,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后炉峰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畏妖,經...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年疼阔,在試婚紗的時候發(fā)現(xiàn)自己被綠了戒劫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡婆廊,死狀恐怖迅细,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情否彩,我是刑警寧澤疯攒,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站列荔,受9級特大地震影響敬尺,放射性物質發(fā)生泄漏枚尼。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一砂吞、第九天 我趴在偏房一處隱蔽的房頂上張望署恍。 院中可真熱鬧,春花似錦蜻直、人聲如沸盯质。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽呼巷。三九已至,卻和暖如春赎瑰,著一層夾襖步出監(jiān)牢的瞬間王悍,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工餐曼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留压储,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓源譬,卻偏偏與公主長得像集惋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子踩娘,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348