請教C動態分配記憶體的問題,大家都進來看看,可能很多人以前都沒注意到的問題

時間 2022-01-16 15:45:06

1樓:糖二灰

windows裡malloc時,作業系統分配記憶體時會在分配的記憶體前面多分配20個位元組,其中前16個位元組用於記憶體管理時使用,後4個位元組用於標識記憶體邊界。分配空間後面也會有4個位元組用於標識邊界。

如malloc分配一個n位元組的空間,實際的記憶體為返回的指標指向如下記憶體段的首地址

↓|16個位元組的記憶體管理資訊|4位元組邊界|n位元組的空間|4位元組邊界|↑這裡的第5個位元組到第8位元組是一個4位元組整形,記錄著記憶體空間的大小這是上邊的解釋,你圖上的 屯 字的位置就是 上邊n位元組空間的位置,你所能使用的記憶體只到 屯 結束的位置,

至於後邊多出來的應該是每次分配記憶體中後續邊界問題造成的,雖然也佔用了一定記憶體,

但是你是不能使用的,你所能使用的就是前50個而已。

至於為什麼32位系統是多出來14個位元組,64位系統多出來30個位元組,應該是邊界不同問題造成的。

具體我也不很清楚,只能幫你到這裡了, o(╯□╰)o

2樓:黑洞之謎

c/c++中的記憶體分配本來就不是要多少就給多少,而是儘量和二進位制的邊界對齊,以便可以重複使用分配的記憶體,或合併兩塊臨近的記憶體塊,為更多的記憶體需求服務。分塊的大小和堆的演算法有關係,不用深究吧。

3樓:將

c的基本資料型別在不同版本下長度不同,這是在32位於64位下記憶體分配產生區別的根本原因。

望採納。

問一個c++動態分配記憶體的問題

4樓:匿名使用者

你看你的程式裡有有多少個new咯...

head=new phone; //一個for(int i=0;inext=pp;

cout

你的phonebook表示的就是一個連結串列吧,裡面存放的是phone資料?

這樣的話就只要一個指標指向頭部就行了。搞兩個幹嘛?

假若p是頭指標,析構的時候這樣就行:

phone * pp = null;

while(p)

5樓:匿名使用者

phonebook::phonebook(int a)

cout<

6樓:

還有一塊記憶體用來存放指標的地址呀.

指標一塊 new 了5塊,正好6塊

c++中指標與動態記憶體分配和記憶體洩漏問題

7樓:留下痕跡的人生

int main()

這段**沒有造成洩漏

int main()

這段**出現記憶體洩漏了

int *p = new int // 申請一塊堆區記憶體,就給個名為f吧,現在p指向f

p = &a; // p指向變數a,是個區域性變數,在棧上分配,此時沒有任何指標堆區記憶體塊f

// 記憶體f就被孤立起來,無法進行釋放,修改等操作了,等同於無法使用的記憶體

// 當有一塊記憶體既無法釋放也無法使用時,這就是記憶體洩漏

// new申請的記憶體是堆區記憶體,通過手動(new)分配,手動(delete)**,工具是指標

// 區域性變數的記憶體是棧區記憶體,自動分配,自動**。

8樓:

new的物件不釋放才會導致記憶體洩漏。

後一段** p指標初始化的時候分配了新的記憶體空間(new int),然後p又被賦值指向了a空間,之前指向的新int記憶體沒有釋放,會一直佔用,導致記憶體洩漏問題。

指標自身佔用4個位元組,儲存的是另一處記憶體空間的地址,對指標變數的賦值操作只會改變其儲存的目標地址,而目標地址處的記憶體空間不受影響。理解了指標,可以更好理解它的運用。

9樓:寒寒家

只有new,malloc這類動態申請記憶體的方式,才可能出現記憶體洩露。

這些方式,申請的記憶體在堆上,不會隨著程式(或函式)的結束而被自動的釋放,必須手動的釋放記憶體。

而第一個例子中,都是區域性變數,區域性變數都在棧裡,都會隨著程式(或函式)的結束,而被釋放。

10樓:匿名使用者

int a = 0;該資料分配在棧(stack)裡,不需要手動釋放。int *p = &a,該指標p所指的地址就是棧內地地址,所以不需要手動釋放,所以不會記憶體洩漏。

int *p = new int;也就是在堆(heap)中分配一塊記憶體,地址儲存在p中。堆上申請的記憶體需要手動釋放(delete p;),否則就會記憶體洩漏.你又將p指向了a的地址,那麼原來在堆中分配的那塊地址由於未及時釋放,現在找不到它的地址了(本來是儲存在p中的),就無法再被使用。

「兩者同樣都是被另一地址給覆蓋」:你要搞清楚一個問題,不管是int *p = &a;還是int * p = new int; p指標本身還都是在棧上,不過前者p的值是a的地址,後者p的值是new的一個堆上的地址,記憶體洩漏並不是p所在記憶體洩漏,而是它所指的那塊地址。

好好思考一下:記憶體洩漏,堆疊的概念吧。

c++問題 關於char的動態分配記憶體

11樓:

你程式**邏輯bai

有問題。dustrlen是求字串zhi長,字串必須以'\0'結束,你的字dao符沒有回以這個字元結束,因此求答得的結果是不確定的。不一定是16。下面,給你一個正確的例子了。

char *a;

a=new char[10];

a[0] ='a';

a[1] ='b';

a[2] ='\0';

int temp=strlen(a); //這時temp的值應該是2。

12樓:匿名使用者

strlen是檢視一個字串的

長度, 和陣列一點關係都沒有, 只跟記憶體裡面連續的內容有關

傳遞迴給strlen的是一個記憶體地址

答, 從那個地址往後面看, 到第一個值為0的地址的距離, 就是strlen的返回值.

傳遞給sizeof的一定是個變數,型別或者陣列名, 當sizeof的是一個變數或者型別, 則返回該變數和型別的大小, 如果sizeof的是一個陣列, 則返回這個陣列佔據的空間大小

p.s. 對一個指向陣列的指標來說, sizeof他並不會返回陣列的大小, 只會返回這個指標的大小, 往往是4個bytes. (根據編譯和執行環境而定)

13樓:匿名使用者

strlen是在執行時求字串的大小,以'\0'為結束符的,由於是動態分配的記憶體,其記憶體的值是不確定的,所以得出16,也有可能是其他的值,這個是不確定的.

sizeof是在編譯時確定大小的.

關於c++動態記憶體分配的問題。

14樓:匿名使用者

肯定存在安全隱患啊,你這屬於記憶體超界了啊。

如果超界的部分還未被使用,那就暫時沒問題而已。

15樓:歸會肖巨集遠

不會自動**的哦,記住了。一定要記得用delete。

16樓:聊芳敬帥

intexample(char*

sp)這段**你可以來逐源步除錯到return時候就返回了baidelete不會執行

另外duc++中new分配的空間一定要用delete才能zhi清空這個我以前做過實dao驗的。

誰能講解了C 中 有關動態分配記憶體的問題

靜態與動態記憶體分配的兩個主要區別是 1 靜態物件是有名字的變數,我們直接對其進行操作。而動態物件是沒有名字的變數,我們通過指標間接地對它進行操作。2 靜態物件的分配與釋放由編譯器自動處理。程式設計師需要理解這一點,但不需要做任何事情。相反,動態物件的分配與釋放,必須由程式設計師顯示地管理,相對來說...

C語言動態分配記憶體為什麼總是提示警告?可以執行

北問邇 1.就算沒有free main 結束後也是會自動釋放malloc 的記憶體的,這裡監控者是作業系統,設計嚴謹的作業系統會登記每一塊給每一個應用程式分配的記憶體,這使得它能夠在應用程式本身失控的情況下仍然做到有效地 記憶體。你可以試一下在taskmanager裡強行結束你的程式,這樣顯然是沒有...

c語言如何給動態分配的陣列賦值,C語言如何給動態分配的陣列賦值

那樣賦值也只能用可變參了.void set int value,int num,int b int malloc 3 sizeof int set b,3,4,5,6 set 設定變數,設定的數量,值1,值2. 1 當成普通陣列使用,用for迴圈即可賦值。2 例程 include include i...