10-記憶體空間佈局

東閣堂主發表於2019-02-12

寫在前面

每個應用都有自己獨立的記憶體空間--今天不會講太多程式碼,主要是理論。
複製程式碼

名詞解釋

每個應用都有自己獨立的記憶體空間,其記憶體空間一般都有以下幾大區域
棧空間,堆空間,程式碼區,全域性區,其實我們主要關心的是堆區,因為我們的程式碼的宣告週期都在堆區裡完成。
複製程式碼
名 稱 說明 作用
堆空間 每呼叫一個函式就會給它分配一段連續的棧空間,等函式呼叫完畢後會自動回收這段棧空間 自動分配和回收
堆空間 需要主動去申請和釋放 比如類的物件的建立
程式碼區 程式碼段(程式碼區) 用於存放程式碼
全域性區 資料段(全域性區) 用於存放全域性變數等

碼上建功 --堆空間

在程式執行過程,為了能夠自由控制記憶體的生命週期、大小,會經常使用堆空間的記憶體
堆空間的申請\釋放
malloc \ free 
new \ delete
new [] \ delete []

是不是有點速度快,Java和OC中局可以使用new來初始化一個物件。
來看幾個栗子
// 沒有初始化
int *p1 = new int;
// 初始化為0
int *p2 = new int();
// 初始化為5
int *p3 = new int(5);
// 沒有初始化
int *p4 = new int[3];
// 全部元素初始化為0
int *p5 = new int[3]();
// 全部元素初始化為0
int *p6 = new int[3]{};
// 首元素初始化為5,其他元素初始化為0
int *p7 = new int[3]{ 5 };

這樣做有什麼問題沒,C++ 可沒有ARC和GC管理機制
new 這麼多的物件,肯定造成記憶體洩露了。
每new一次就要在不使用的時候銷燬(delete),要成對出現
int *p = new int;
delete p;

複製程式碼

碼說 --棧空間 全域性區

定義一個結構體
struct Person {
    int m_age;
};
// 全域性區
Person g_person;
// 棧空間
Person person;
int main() {
    // 棧空間
    Person person;
    // 堆空間
    Person *p = new Person();
    p->m_age = 20;
    delete p;
    //舉一個malloc的栗子
    Person *p2 = (Person *) malloc(sizeof(Person));
    free(p2);
}

複製程式碼

裝逼一下

申請堆空間成功後,會返回那一段記憶體空間的地址
申請和釋放必須是1對1的關係,不然可能會存在記憶體洩露
現在的很多高階程式語言不需要開發人員去管理記憶體(比如Java),遮蔽了很多記憶體細節,利弊同時存在
利:提高開發效率,避免記憶體使用不當或洩露
弊:不利於開發人員瞭解本質,永遠停留在API呼叫和表層語法糖,對效能優化無從下手 --奸笑
複製程式碼

完整程式碼demo,請移步GitHub:DDGLearningCpp

當然C++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記?

相關文章