在學習c++的過程中涉及到了new和delete的問題,了解過程中發現了一些關於xcode堆記憶體分配機制的特性
#include #include class node ;
int node::count = 0 ;
node::node( int a,char * n):number(a)else
node::count +=1 ;
std::cout}void node::print()
在這段**中 我定義了乙個類 並且先後手動分配了b,c的儲存空間 。
我在給新增資料之後delete了b(注意這裡並沒有將b指向nullptr)然後為c分配了記憶體空間
在輸出b的時候得出了如下結果
kjk呼叫了建構函式
kjk呼叫了析構函式
c呼叫了建構函式
21312
program ended with exit code: 0
用b指標訪問記憶體空間會輸出c的資料
因為指標中儲存的記憶體位址並沒有改變 因此b指向的記憶體位址仍然是之前被delete掉的記憶體位址
而且輸出了c的資料 說明這塊記憶體被分配給了c,也就是說b和c指向了同一塊記憶體空間,說明xcode編譯器對堆的記憶體分配是有序的
delete在這裡只是告訴編譯器這塊記憶體可以重新使用了,於是第二次分配記憶體的時候再次將這塊記憶體分配了出去
這裡可以簡單想象成乙個單向鍊錶的遍歷,編譯器在遍歷過程中尋找可用的記憶體空間,並將第乙個可用的記憶體空間分配出去 每次分配的時候遍歷一次鍊錶
這樣可能會造成手動分配記憶體空間的速度更慢
int main ()
如果我們不再給c分配記憶體空間 輸出b 仍然會得到232653 說明delete之後堆記憶體空間中原有的資料並沒有真正的清空 新的資料覆蓋之後才會徹底消失
這裡類似於硬碟的刪除機制
之後筆者又在vs2015中測試了同樣的** 得到了不同的結果 vs是隨機對堆記憶體進行分配的
以上僅為個人觀點 如有不同 歡迎指正
對於棧記憶體和堆記憶體的理解
1.和堆一樣儲存在計算機ram中 2.棧是為執行執行緒留出的記憶體空間 3.棧附屬於執行緒,因此當執行緒結束時棧被 4.執行緒被建立的時候,設定棧的大小 5.當用棧過多時會導致棧溢位 無窮次 大量的遞迴呼叫,或者大量的記憶體分配 6.如果在編譯之前精確的知道要分配資料的大小並且不是太大的時候,可以使...
對於Exception的處理
使用checked exception還是unchecked exception的原則,我的看法是根據需求而定。如果你希望強制你的類呼叫者來處理異常,那麼就用checked exception 如果你不希望強制你的類呼叫者來處理異常,就用unchecked。那麼究竟強制還是不強制,權衡的依據在於從業...
堆記憶體的管理
1.1 對於堆的管理,核心提供了兩個系統呼叫brk和mmap。brk 用於更改堆頂位址,mmap則為程序分配虛擬位址空間。1.2 當程序向glibc申請記憶體時,如果申請的記憶體的數量大於閥值的時候,glibc會採用mmap為程序分配一塊虛擬位址空間,而不是採用brk來擴充套件棧頂的指標。1.2.1...