1. 程式人生 > >記憶體管理函式(C++學習筆記 14)

記憶體管理函式(C++學習筆記 14)

一、C語言中的記憶體管理函式

  • 記憶體分配函式主要有malloc( )和calloc( ),記憶體釋放函式是free( )。
  • 這兩類函式的原型在stdlib.h中,要使用這些函式時,首先要用檔案包含:
    #include"stdlib.h" 或#include<stdlib.h>
1、記憶體分配函式malloc( )

函式原型:void *malloc(int size);
例子:

int *pi1,*pi2;
pi1=(int *)malloc(sizeof(int));  //分配2位元組,即整型資料長度
pi2=(int *)malloc
(sizeof(int)*100); //分配200位元組

注意:malloc只進行記憶體分配,並不能對所得的記憶體進行初始化,因此分配的記憶體單元儲存的是隨機值。

2、記憶體塊分配函式calloc( )

函式原型:void *calloc(unsigned n, unsigned size);
例子:

int *pi;
pi = (int *)calloc(10,2);  //分配10塊大小為2位元組的記憶體空間
pi = (int *)malloc(20);  //兩者等價
3、記憶體釋放函式free( )

函式原型:void free(void *block);
例子:

int *
pi; pi = (int *)malloc(4); //分配4位元組的記憶體空間 *pi = 100; free(pi); pi=(int *)malloc(sizeof(int)*100); free(pi);

二、C++中的記憶體管理函式

  • C++使用運算子new和delete進行記憶體的分配和釋放。但是為了與C語言相容,C++仍保留了malloc和free這兩個函式。
1、記憶體分配
  • 運算子new用於記憶體分配的最基本形式為:指標變數名=new 型別;
    例如,
   int *p = new int;
   //或者
   int *p;
   p =
new int;
  • 運算子new從稱為堆的一塊自由儲存區中為程式分配一塊與型別位元組數相適應的記憶體空間,並將該塊記憶體的首地址存於指標變數中。
  • 補充 1:使用new可以為陣列動態分配記憶體空間,這時需要在型別名後面綴上陣列大小,例如:new為具有10個數組元素的整型陣列分配了記憶體空間,並將其首地址賦給了指標pi。
int *pi=new int[10];   //動態分配10個整型記憶體空間

例子:

#include<iostream>
#include<string>
using namespace std;
int main(){
    float *d=new float[3];
    d[0]=3;
    d[1]=6;
    d[2]=9;
    for(int i=0;i<3;i++,d++){
    	cout<<"d[0]="<<d[0]<<endl;
	}
	return 0;
}

結果為:
在這裡插入圖片描述

  • 補充 2:new可在為簡單變數分配記憶體的同時,進行初始化。其基本形式為:指標變數名=new 型別(初值);
    例如:int *p = new int(99);
  • 補充 3:使用new動態分配記憶體時,若沒有足夠的記憶體滿足分配要求,則動態分配空間失敗,有些編譯系統將返回空指標NULL,因此可以對 記憶體的動態分配是否成功進行檢查:
    例子:對動態分配是否成功進行檢查。
#include<iostream>
using namespace std;
int main(){
	int *p=new int;
	if(!p){
		cout<<"allocation failure!\n"<<endl;
		return 1;
	}
	*p=20;
	cout<<*p;
	delete p;
	return 0;
}
  • 補充 4:用new分配的儲存空間不會自動釋放,只能通過delete釋放。因此要適時釋放動態分配的儲存空間。
2、記憶體釋放
  • 運算子delete用於釋放運算子new分配的儲存空間。該運算子釋放儲存空間的基本形式為:delete 指標變數名;
  • 釋放動態分配的陣列儲存區時,可使用如下的delete格式:delete []指標變數名;
    注意:在此指標變數名前只用一對方括號,無需指出所刪除陣列的維數和大小。
3、使用new和delete的簡單例子。
#include<iostream>
using namespace std;
int main(){
	int *ptr;
	ptr=new int;
	*ptr=10;
	cout<<*ptr;
	delete ptr;
	return 0;
}