c 記憶體管理 1

2021-09-01 06:14:15 字數 2793 閱讀 6822

要學好記憶體管理,首先要了解程式中記憶體區域的劃分:

說明:(1)棧又叫堆疊,裡面存放非靜態區域性變數/函式引數/ 返回值等資料,棧是向下增長的;

(2)記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享記憶體,做程序間通訊;

(3)堆用於程式執行時動態記憶體分配,堆是向上增長的;

(4)資料段---儲存全域性資料和靜態資料;

(5)**段-可執行的**/唯讀常量.

常見問題:我們對記憶體劃分區域是為了幹嘛?

答:是為了更好的管理資料。

下面來看一段**:

#include using namespace std;

int globalvar = 1;

static int staticglobalvar = 1;

void test()

; char char2 = "abcd";

char* pchar3 = "abcd";

int* ptr1 = (int*)malloc(sizeof (int)* 4);

int* ptr2 = (int*)calloc(4, sizeof(int));

int* ptr3 = (int*)realloc(ptr2,sizeof(int)*4);

free(ptr1);

free(ptr3);

}int main()

填空:globalvar在資料段;      staticvar在資料段;        num1在棧 上      staticglobalvar在資料段;                     

localvar在棧 上 ;           char2在棧上;               *char2存在棧(陣列指向的內容還是在棧上)

pchar3在棧;                 *pchar 3在**段;       ptr1在棧上;     *ptr1在堆上

計算:

#include using namespace std;

int globalvar = 1;

static int staticglobalvar = 1;

void test()

; char char2 = "abcd";

char* pchar3 = "abcd";

int* ptr1 = (int*)malloc(sizeof (int)* 4);

int* ptr2 = (int*)calloc(4, sizeof(int));

int* ptr3 = (int*)realloc(ptr2,sizeof(int)*4);

free(ptr1);

free(ptr3);

printf("%d\n", sizeof(num1)); //40

printf("%d\n", sizeof(char2));//5

printf("%d\n", strlen(char2));//4

printf("%d\n", sizeof(pchar3));//4

printf("%d\n", strlen(pchar3));//4

printf("%d\n", sizeof(ptr1));//4

}int main()

計算結果:

在了解c++動態記憶體管理之前,先了解下c語言中的動態記憶體管理函式:

malloc:開闢空間,不初始化;

calloc:開闢空間,並初始化,相當於malloc+memset;

realloc:增容,既可擴容,還可縮小;

這裡我寫的不是很詳細,想要知道更多他們區別的,可以參考:

需要注意的是:申請和釋放單個元素的空間,使用new和delete操作符,但是若是申請和釋放連續的空間,則使用new[ ]和delete[ ].

通過上面**,我們可以發現,c++的動態記憶體管理相比於c語言,還是有一定的優勢,比如,c++中,不需要強轉;不需要算位元組數,給個型別,會自動算出大小;還有就是c語言中用的是函式,而c++中的new是乙個操作符,不是乙個函式。

c++定義new和delete和c語言中的malloc在內建型別都是一樣的,都是開闢空間,但是針對於自定義型別的,new不僅開闢空間,而且還初始化,malloc是只開闢空間,並沒有進行初始化。

#include using namespace std;

class date

private:

int _year;

int _month;

int _day;

};int main()

除錯結果:

記憶體管理(1)

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區 常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

記憶體管理(1)

記憶體管理 如果對乙個物件使用了alloc,mutable copy withzone 或者retain,那麼你必須使用相應的release或者autorelease。基本型別 任何c的型別 如 int,long,long long,struct等。記憶體管理對於c語言基本型別無效。oc型別 非基本...

apache記憶體管理1

如果由作業系統進行管理記憶體,作業系統在分配和管理記憶體,應該會存在使用者態與核心態的切換,而且會有位址空間的預定和調撥物理儲存器等一系列的操作,而這些操作是不可控的,極大的影響了效率。apache自己管理記憶體,速度是乙個重要的原因。每一連續的記憶體 邏輯上,物理上的位址空間不一定是 都由記憶體管...