每一個應用都有本身獨立的內存空間--今天不會講太多代碼,主要是理論。
複製代碼
每一個應用都有本身獨立的內存空間,其內存空間通常都有如下幾大區域
棧空間,堆空間,代碼區,全局區,其實咱們主要關心的是堆區,由於咱們的代碼的聲明週期都在堆區裏完成。
複製代碼
名 稱 | 說明 | 做用 |
---|---|---|
堆空間 | 每調用一個函數就會給它分配一段連續的棧空間,等函數調用完畢後會自動回收這段棧空間 | 自動分配和回收 |
堆空間 | 須要主動去申請和釋放 | 好比類的對象的建立 |
代碼區 | 代碼段(代碼區) | 用於存放代碼 |
全局區 | 數據段(全局區) | 用於存放全局變量等 |
在程序運行過程,爲了可以自由控制內存的生命週期、大小,會常常使用堆空間的內存
堆空間的申請\釋放
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:DDGLearningCppgit
固然C++大神就繞吧,非喜勿噴,畢竟這是我的的學習筆記📒github