1樓:練雁雙儀
linux中,c++記憶體分配方式有三種:
1)從靜態儲存區域分配。記憶體在程式編譯的時候就已經分配好,這塊記憶體在程式的整個執行期間都存在。例如全域性變數,static變數。
2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內建於處理器的指令集中,效率很高,但是分配的記憶體容量有限。
3)從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。
常見的記憶體錯誤:
記憶體分配未成功,卻使用了它。
記憶體分配雖然成功,但是尚未初始化就引用它。
記憶體分配成功並且已經初始化,但操作越過了記憶體的邊界。
例如在使用陣列時經常發生下標「多1」或者「少1」的操作。特別是在for迴圈語句中,迴圈次數很容易搞錯,導致陣列操作越界。)
忘記了釋放記憶體,造成記憶體洩露。
釋放了記憶體卻繼續使用它。
c語言中函式定義時記憶體分配過程
2樓:
您好親,<>
第一階段——程式直接操作實體記憶體。某臺計算機總的記憶體大小是128m,現在同時執行兩個程式a和b,a需佔用記憶體10m,b需佔用記憶體100。計算機在給程式分配記憶體時會採取這樣的方法:
先將記憶體中的前10m分配給程式a,接著再從記憶體中剩餘的118m中劃分出100m分配給程式b第二階段——分段(解決了第一階段的第1和第3個問題)在程序和實體記憶體增加一箇中間層,利用一種間接的地址訪問方法訪問實體記憶體。程式中訪問的記憶體地址不再是實際的實體記憶體地址,而是一個虛擬地址,然後由作業系統將這個虛擬地址對映到適當的實體記憶體地址上。這樣,只要作業系統處理好虛擬地址到實體記憶體地址的對映,就可以保證不同的程式最終訪問的記憶體地址位於不同的區域,彼此沒有重疊,就可以達到記憶體地址空間隔離的效果。
第三階段——分頁(解決了第一階段的第2個問題)將地址空間分成許多的頁。每頁的大小由cpu決定,然後由作業系統選擇頁的大小。目前inter系列的cpu支援4kb或4mb的頁大小,而pc上目前都選擇使用4kb希望我的對您有幫助,謝謝,祝您生活愉快!
c語言陣列在記憶體中是怎麼分配的?
3樓:惠企百科
c語言使用的記憶體是虛擬記憶體。按照功能的不同在c語言中又將虛擬記憶體為分三類:棧區、堆區、靜態資料區,不管是單一變數還是陣列,其記憶體分配都是這樣分的。
在棧區、靜態資料區、堆區會有編譯器負責分配、作業系統負責管理,程式設計師可以在堆區使用malloc()來動態分配堆記憶體的問題。
c語言陣列在記憶體中是怎麼分配的?
4樓:惠企百科
c語言中記憶體為分三類:棧區、堆區、靜態資料區。
區域性變數在棧上分配,函式呼叫前的棧指標,要和函式返回後的棧指標一樣,否則就會出錯。
void test(void)
char i,a[10];
printf("0x%x", i);
printf("0x%x", a);
printf("0x%x", a+1);
printf("0x%x", a+2);
printf("0x%x", a+3);
c++中的記憶體分配方式有幾種
5樓:匿名使用者
記憶體的三種分配方式:
1. 從靜態儲存區分配:此時的記憶體在程式編譯的時候已經分配好,並且在程式的整個執行期間都存在。全域性變數,static變數等在此儲存。
2. 在棧區分配:相關**執行時建立,執行結束時被自動釋放。區域性變數在此儲存。棧記憶體分配運算內建於處理器的指令集中,效率高,但容量有限。
3. 在堆區分配:動態分配記憶體。用new/malloc時開闢,delete/free時釋放。生存期由使用者指定,靈活。但有記憶體洩露等問題。
常見記憶體錯誤及對策。
1. 記憶體分配未成功,卻被使用。
對策:使用記憶體之前檢查是否分配成功。用p!=null判斷。
2. 記憶體分配成功,未初始化就被使用。
記憶體的預設值沒有統一的標準。大部分編譯器以0作為初始值,但不完全是。
對策:記憶體初始化時賦初值。
3. 記憶體操作越界。
對策:只能是小心了。
4. 釋放了記憶體,仍然使用。
1) 使用顯示delete和free的野指標。
對策:釋放完記憶體,將指標置為null。
2) 使用隱式delete和free的野指標。主要是指函式返回指向棧記憶體的指標或引用。
對策:當然是不要返回就可以了。
5. 未釋放記憶體,導致記憶體洩露。
用new/malloc開闢了記憶體,沒用delete/free釋放。
對策:new和delete的個數一定相同;malloc和free的個數一定相同;new和delete一定對應。
6樓:習慣這生活
你是想問,new()和malloc()嗎。
一個是分配原始的記憶體,一個是先分配記憶體,然後呼叫建構函式。
7樓:網友
1)靜態記憶體分配,全域性變數等。
2)棧記憶體分配,函式的區域性變數,返回值等。
3)動態記憶體分配,在程式裡面隨機申請的記憶體,new
C 中new分配記憶體的問題,C 動態分配記憶體 記憶體洩漏問題 new
這樣是會有記憶體洩漏的,因為第一次執行s new stu 後,系統申請了一塊新的記憶體空間 型別為stu 並把其地址賦給s 第2此執行s new stu後,系統又申請了一塊新的記憶體空間,並把其地址賦給s,此時把s原來的值覆蓋掉了,也就是第一次申請的記憶體空間的地址丟失了 而delete s 只是把...
c 繼承後的記憶體分配問題,c 中給結構體分配動態記憶體的問題 用new嗎 怎麼用
不能訪問是不能直接通過派生類物件直接呼叫,但是可以通過派生類的成員函式呼叫基類的公有函式來訪問基類的私有屬性.難道編譯器會分配一塊記憶體放著不管造成記憶體洩漏?因為在派生類中通過可以定義新函式成員來訪問這些記憶體 間接訪問 比如呼叫基類派生下來的成員函式 所以這些記憶體是可以被主動訪問或銷燬的。私有...
c語言中整形資料在記憶體中的儲存形式是什麼
整形資料在計算機中的資料的儲存和運算都是以二進位制的形式進行的回,但不是直接的原碼答,而是原碼的補碼,也就是說在計算機中,資料的運算都是以資料的補碼進行的.整型資料在記憶體中的存放形式 如果定義了一個整型變數i int i 10 0000000000001010 數值是以補碼錶示的 n 正數的補碼和...