在編寫程序時,通常并不知道需要處理的數(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]);
}