xcode對於堆記憶體的處理

2021-07-27 20:50:42 字數 1057 閱讀 3928

在學習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...