C語言精華——內存管理试躏,很多學校學習不到的知識~

在編寫程序時,通常并不知道需要處理的數(shù)據(jù)量设褐,或者難以評估所需處理數(shù)據(jù)量的變動程度颠蕴。在這種情況下,要達到有效的資源利用——使用內存管理助析,必須在運行時動態(tài)地分配所需內存犀被,并在使用完畢后盡早釋放不需要的內存,這就是動態(tài)內存管理原理外冀。動態(tài)內存管理同時還具有一個優(yōu)點:當程序在具有更多內存的系統(tǒng)上需要處理更多數(shù)據(jù)時寡键,不需要重寫程序。

一雪隧、動態(tài)內存分配

1西轩、malloc函數(shù)

能夠在堆中動態(tài)地分配一塊指定大小的內存空間。malloc中文叫 動態(tài)內存分配?脑沿,用于申請一塊連續(xù)的指定大小的內存塊區(qū)域以void*類型返回分配的內存區(qū)域地址藕畔,當無法知道內存具體位置的時候,想要綁定真正的內存空間?捅伤,就需要用到動態(tài)的分配內存劫流,且分配的大小就是程序要求的大小。

函數(shù)原型:

void* malloc(unsigned int size);

返回:返回一個指向被分配的內存塊起始位置

失敗返回NULL指針丛忆,說明沒有分配成功祠汇。

2、泛型指針

void*

相同類型的指針可以相互轉化熄诡,泛型指針就是:可以轉化成任何類型的指針

int *p = malloc(sizeof(int));

if (p != NULL)

{

printf("動態(tài)開辟內存成功.\n");

}

else

{

printf("失敗\n");

}

*p = 45;

char *p1=malloc(sizeof(char));

*p1 = 'A';

//是分配的一塊連續(xù)的內存空間

3可很、calloc函數(shù)

有時候,我們在程序中需要一段內存來處理數(shù)據(jù)凰浮,但是又不確定是要多大內存的情況下我抠,比如 我們申請一個數(shù)組 a[100] 但是事前我們并不知道會不會用得完這100個元素,比如我們只會用到10個袜茧,那么剩下的90個就會還在占用空間菜拓,就顯得很浪費空間,這時候使用calloc函數(shù)是用來在內存的 動態(tài)存儲?區(qū)中(堆中)分配一個連續(xù)存儲空間笛厦。

//函數(shù)原型:

void *calloc( size_t num , size_t size);

//分配的這塊空間 會被初始化為0

//numNumber of elements.

??sizeLength in bytes of each element.

//效率: malloc效率要高纳鼎,calloc還要將里面初始化為0.

4、realloc函數(shù)

用于修改原先已經(jīng)分配好了的內存空間大小,realloc()函數(shù)可以重用或擴展以前用malloc()贱鄙、calloc()及realloc()函數(shù)自身分配的內存劝贸。

函數(shù)原型:

void *realloc( void *memblock , size_t size);

memblockPointer to previously allocated memory block.

sizeNew size in bytes.

//擴大:

//縮小:

5逗宁、內存釋放

free();

//函數(shù)原型

void free(void *memblock);

int *p=malloc(sizeof(int) * 5);

p[0] = 11;

p[1] = 22;

p[2] = 33;

p[3] = 44;

p[4] = 55;

for (int i = 0; i < 5;i++)

{

printf("%d\t",p[i]);

}

printf("\n");

//釋放這塊內存空間

free(p);

//p野指針指向一塊非法的內存空間

6映九、內存泄漏

對于任何使用 C 語言的人,如果問他們 C 語言的最大煩惱是什么瞎颗,其中許多人可能會回答說是指針和內存泄漏件甥。

在計算機科學中,內存泄漏指由于疏忽或錯誤造成程序未能釋放已經(jīng)不再使用的內存哼拔。內存泄漏并非指內存在物理上的消失嚼蚀,而是應用程序分配某段內存后,由于設計錯誤管挟,導致在釋放該段內存之前就失去了對該段內存的控制轿曙,從而造成了內存的浪費。

在C++中出現(xiàn)內存泄露的主要原因就是程序猿在申請了內存后(malloc(), new)僻孝,沒有及時釋放沒用的內存空間导帝,甚至消滅了指針導致該區(qū)域內存空間根本無法釋放。

知道了出現(xiàn)內存泄露的原因就能知道如何應對內存泄露穿铆,即:不用了的內存空間記得釋放您单!

內存泄漏可能會導致嚴重的后果:

●? 程序運行后,隨著時間占用了更多的內存荞雏,最后無內存可用而崩潰虐秦;

●??程序消耗了大量的內存,導致其他程序無法正常使用凤优;

●??程序消耗了大量內存悦陋,導致消費者選用了別人的程序而不是你的;

●??經(jīng)常做出內存泄露bug的程序猿被公司開出而貧困潦倒筑辨。

如何檢測內存泄露

觀察內存泄露是一個兩步驟的過程俺驶。首先,使用swap命令觀察還有多少可用的交換空間:

/usr/sbin/swap -s

total:17228K bytes allocated + 5396K reserved=22626K used棍辕,29548K available.

在一兩分鐘內鍵入該命令三到四次暮现,看看可用的交換區(qū)是否在減少。還可以使用其他一些/usr/bin/*stat工具如netstat楚昭、vmstat等栖袋。如發(fā)現(xiàn)波段有內存被分配且從不釋放,一個可能的解釋就是有個進程出現(xiàn)了內存泄露抚太。

7塘幅、內存操作函數(shù)

#include <string.h>

memcpy()

memmove()

memchr()

memset()

//-----------

int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

int arr1[10];

//memcpy(arr1,arr,sizeof(arr));

memset(arr1,0,40);

for (int i = 0; i < 10;i++)

{

printf("%d\n",arr1[i]);

}

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末菇怀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子晌块,更是在濱河造成了極大的恐慌,老刑警劉巖帅霜,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件匆背,死亡現(xiàn)場離奇詭異,居然都是意外死亡身冀,警方通過查閱死者的電腦和手機钝尸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來搂根,“玉大人珍促,你說我怎么就攤上這事∈@ⅲ” “怎么了猪叙?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仁卷。 經(jīng)常有香客問我穴翩,道長,這世上最難降的妖魔是什么锦积? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任芒帕,我火速辦了婚禮,結果婚禮上丰介,老公的妹妹穿的比我還像新娘背蟆。我一直安慰自己,他們只是感情好哮幢,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布带膀。 她就那樣靜靜地躺著,像睡著了一般橙垢。 火紅的嫁衣襯著肌膚如雪本砰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天钢悲,我揣著相機與錄音点额,去河邊找鬼。 笑死莺琳,一個胖子當著我的面吹牛还棱,可吹牛的內容都是我干的。 我是一名探鬼主播惭等,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼珍手,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起琳要,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤寡具,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后稚补,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體童叠,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年课幕,在試婚紗的時候發(fā)現(xiàn)自己被綠了厦坛。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡乍惊,死狀恐怖杜秸,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情润绎,我是刑警寧澤撬碟,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站莉撇,受9級特大地震影響小作,放射性物質發(fā)生泄漏。R本人自食惡果不足惜稼钩,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一频敛、第九天 我趴在偏房一處隱蔽的房頂上張望裕坊。 院中可真熱鬧赃春,春花似錦牵素、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侨拦,卻和暖如春殊橙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背狱从。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工膨蛮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人季研。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓敞葛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親与涡。 傳聞我的和親對象是個殘疾皇子惹谐,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容