刷題中的知識點1.

簡單的能夠理解爲: heap:是由malloc之類函數分配的空間所在地。地址是由低向高增加的。 stack:是自動分配變量,以及函數調用的時候所使用的一些空間。地址是由高向低減小的。程序員

1、預備知識—程序的內存分配數組

一個由c/C++編譯的程序佔用的內存分爲如下幾個部分 一、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其操做方式相似於數據結構中的棧。數據結構

二、堆區(heap) — 通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS 。注意它與數據結構中的堆是兩回事,分配方式卻是相似於鏈表,呵呵。函數

三、全局區(靜態區)(static)—,全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。 - 程序結束後有系統釋放優化

四、文字常量區 —常量字符串就是放在這裏的。 程序結束後由系統釋放操作系統

五、程序代碼區—存放函數體的二進制代碼。設計

2、例子程序 這是一個前輩寫的,很是詳細 //main.cpp隊列

int a = 0; 全局初始化區內存

char *p1; 全局未初始化區字符串

main() {

int b; 棧

char s[] = "abc"; 棧

char *p2; 棧

char *p3 = "123456"; 123456在常量區,p3在棧上。

static int c =0; 全局(靜態)初始化區

p1 = (char *)malloc(10);

p2 = (char *)malloc(20);

分配得來得10和20字節的區域就在堆區。 strcpy(p1, "123456"); 123456放在常量區,編譯器可能會將它與p3所指向的"123456"優化成一個地方。 }

堆和棧的區別主要分:

操做系統方面的堆和棧,如上面說的那些,很少說了。 還有就是數據結構方面的堆和棧,這些都是不一樣的概念。這裏的堆實際上指的就是(知足堆性質的)優先隊列的一種數據結構,第1個元素有最高的優先權;棧實際上就是知足先進後出的性質的數學或數據結構。 雖然堆棧,堆棧的說法是連起來叫,可是他們仍是有很大區別的,連着叫只是因爲歷史的緣由針值讀 在計算機科學中,內存泄漏(memory leak)指因爲疏忽或錯誤形成程序未能釋放已經再也不使用的內存的狀況。內存泄漏並不是指內存在物理上的消失,而是應用程序分配某段內存後,因爲設計錯誤,失去了對該段內存的控制,於是形成了內存的浪費。內存泄漏與許多其餘問題有着類似的症狀,而且一般狀況下只能由那些能夠得到程序源代碼的程序員才能夠分析出來。然而,有很多人習慣於把任何不須要的內存使用的增長描述爲內存泄漏,嚴格意義上來講這是不許確的。   通常咱們常說的內存泄漏是指堆內存的泄漏。堆內存是指程序從堆中分配的,大小任意的(內存塊的大小能夠在程序運行期決定),使用完後必須顯式釋放的內存。應用程序通常使用malloc,calloc,realloc,new等函數從堆中分配到一塊內存,使用完後,程序必須負責相應的調用free或delete釋放該內存塊,不然,這塊內存就不能被再次使用,咱們就說這塊內存泄漏了。 內存溢出就是你要求分配的內存超出了系統能給你的,系統不能知足需求,因而產生溢出。 比方說棧,棧滿時再作進棧一定產生空間溢出,叫上溢,棧空時再作退棧也產生空間溢出,稱爲下溢。 這是程序語言中的一個概念,典型的,在C語言中,在分配數組時爲其分配的長度是1024,但往其中裝入超過1024個數據時,因爲C語言不會對數組操做進行越界檢查,就會形成內存溢出錯誤。

相關文章
相關標籤/搜索