10-內存空間佈局

寫在前面

每個應用都有自己獨立的內存空間--今天不會講太多代碼,主要是理論。

名詞解釋

每個應用都有自己獨立的內存空間,其內存空間一般都有以下幾大區域
棧空間,堆空間,代碼區,全局區,其實我們主要關心的是堆區,因爲我們的代碼的聲明週期都在堆區裏完成。
名 稱 說明 作用
堆空間 每調用一個函數就會給它分配一段連續的棧空間,等函數調用完畢後會自動回收這段棧空間 自動分配和回收
堆空間 需要主動去申請和釋放 比如類的對象的創建
代碼區 代碼段(代碼區) 用於存放代碼
全局區 數據段(全局區) 用於存放全局變量等

碼上建功 --堆空間

在程序運行過程,爲了能夠自由控制內存的生命週期、大小,會經常使用堆空間的內存
堆空間的申請\釋放
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++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記📒

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章