寫在前面
每個應用都有自己獨立的記憶體空間--今天不會講太多程式碼,主要是理論。
複製程式碼
名詞解釋
每個應用都有自己獨立的記憶體空間,其記憶體空間一般都有以下幾大區域
棧空間,堆空間,程式碼區,全域性區,其實我們主要關心的是堆區,因為我們的程式碼的宣告週期都在堆區裡完成。
複製程式碼
名 稱 | 說明 | 作用 |
---|---|---|
堆空間 | 每呼叫一個函式就會給它分配一段連續的棧空間,等函式呼叫完畢後會自動回收這段棧空間 | 自動分配和回收 |
堆空間 | 需要主動去申請和釋放 | 比如類的物件的建立 |
程式碼區 | 程式碼段(程式碼區) | 用於存放程式碼 |
全域性區 | 資料段(全域性區) | 用於存放全域性變數等 |
碼上建功 --堆空間
在程式執行過程,為了能夠自由控制記憶體的生命週期、大小,會經常使用堆空間的記憶體
堆空間的申請\釋放
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++大神就繞吧,非喜勿噴,畢竟這是個人的學習筆記?