做蔬果批發(fā)有專門的網(wǎng)站么seo是什么意思怎么解決
文章目錄
- 一.C\C++內(nèi)存分布
- 二.C語言中動態(tài)內(nèi)存管理方式:malloc/calloc/realloc/free
- 三.C++內(nèi)存管理方式
- 3.1.new/delete操作內(nèi)置類型
- 3.2.new和delete操作自定義類型
- 四.operator new與operator delete函數(shù)(重要點進行講解)
- 4.1. operator new與operator delete函數(shù)(重點)
- 五.new和delete的實現(xiàn)原理
- 5.1.內(nèi)置類型
- 5.2 自定義類型
- 六. 定位new表達式(placement-new) (了解)
- 七. 7. 常見面試題
- 7.1. malloc/free和new/delete的區(qū)別
- 7.2 內(nèi)存泄漏
一.C\C++內(nèi)存分布
C和C++的內(nèi)存分布是一樣的
為什么要內(nèi)存區(qū)域劃分?
為了內(nèi)存方便管理
下面的劃分的區(qū)域 堆區(qū)是我們重點關注的,因為堆上的空間是由我們開辟和釋放的,是由我們控 制的。
看代碼回答 問題?
int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = { 1, 2, 3, 4 };char char2[] = "abcd";const char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof(int) * 4);int* ptr2 = (int*)calloc(4, sizeof(int));int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);free(ptr1);free(ptr3);}1. 選擇題:
選項: A.棧 B.堆 C.數(shù)據(jù)段(靜態(tài)區(qū)) D.代碼段(常量區(qū))globalVar在哪里?____ staticGlobalVar在哪里?____staticVar在哪里?____ localVar在哪里?____num1 在哪里?____char2在哪里?____
pChar3在哪里?____
ptr1在哪里?____
2. 填空題:
sizeof(num1) = ____;
*char2在哪里?___*pChar3在哪里?____*ptr1在哪里?____sizeof(char2) = ____;
sizeof(pChar3) = ____;
sizeof(ptr1) = ____;3. sizeof 和 strlen 區(qū)別?
strlen(char2) = ____;strlen(pChar3) = ____;
答案
【說明】
- 棧又叫堆棧–非靜態(tài)局部變量/函數(shù)參數(shù)/返回值等等,棧是向下增長的。
- 內(nèi)存映射段是高效的I/O映射方式,用于裝載一個共享的動態(tài)內(nèi)存庫。用戶可使用系統(tǒng)接口
創(chuàng)建共享共享內(nèi)存,做進程間通信。(Linux課程如果沒學到這塊,現(xiàn)在只需要了解一下) - 堆用于程序運行時動態(tài)內(nèi)存分配,堆是可以上增長的。
- 數(shù)據(jù)段–存儲全局數(shù)據(jù)和靜態(tài)數(shù)據(jù)。
- 代碼段–可執(zhí)行的代碼/只讀常量。
二.C語言中動態(tài)內(nèi)存管理方式:malloc/calloc/realloc/free
void Test (){int* p1 = (int*) malloc(sizeof(int));free(p1);// 1.malloc/calloc/realloc的區(qū)別是什么?
int* p2 = (int*)calloc(4, sizeof (int));int* p3 = (int*)realloc(p2, sizeof(int)*10);// 這里需要free(p2)嗎? 不需要 原地擴容p3 還是p2接收地址 異地擴容 自動free(p2)
free(p3 );}
【面試題】
- malloc/calloc/realloc的區(qū)別?
- malloc的實現(xiàn)原理? glibc中malloc實現(xiàn)原理
三.C++內(nèi)存管理方式
C語言內(nèi)存管理方式在C++中可以繼續(xù)使用,但有些地方就無能為力,而且使用起來比較麻煩,因
此C++又提出了自己的內(nèi)存管理方式:通過new和delete操作符進行動態(tài)內(nèi)存管理。
3.1.new/delete操作內(nèi)置類型
void Test(){// 動態(tài)申請一個int類型的空間
int* ptr4 = new int;// 動態(tài)申請一個int類型的空間并初始化為10int* ptr5 = new int(10);// 動態(tài)申請10個int類型的空間
int* ptr6 = new int[3];delete ptr4;delete ptr5;delete[] ptr6;}
int main()
{ //開辟一個空間int* ptr = new int;//開辟一共int類型的空間 在堆區(qū) 返回一共堆上開辟好的空間地址//開辟一個空間并且初始化int* ptr1 = new int(10); //只需要在開辟空間類型中+(初始化值)即可cout <<"ptr1存放地址對應值:" << *ptr1 << endl;//開辟多個空間int* ptr2 = new int[10];//在開辟空間類型后加上+[開辟個數(shù)]即可 并返回開辟數(shù)組(多個空間)的首地址//開辟多個空間并且初始化 在之前c++是不允許開辟的數(shù)組初始化的 C++11就可以了int* ptr3 = new int[10] {1, 2, 3, 4, 5};//開辟數(shù)組空間 初始化用{里面寫初始化值} 可以完全初始化 也可不完全初始化 不完全初始化的空間默認初始化為0int arr[5] = { 1,2,3,4,5 };//將開辟好的空間 釋放掉 delete(ptr);delete(ptr1);delete[](ptr2); //數(shù)組的釋放 連續(xù)的空間釋放+delete[] 指針存放地址delete[](ptr3);return 0;
}
注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續(xù)的空間,使用new[]和delete[],注意:匹配起來使用。
3.2.new和delete操作自定義類型
class A{public:A(int a = 0): _a(a){cout << "A():" << this << endl;}~A(){}cout << "~A():" << this << endl;private:int _a;};int main(){// new/delete 和 malloc/free最大區(qū)別是 new/delete對于【自定義類型】除了開空間還會調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)
A* p1 = (A*)malloc(sizeof(A));A* p2 = new A(1);free(p1);delete p2;// 內(nèi)置類型是幾乎是一樣的
int* p3 = (int*)malloc(sizeof(int)); // Cint* p4 = new int;free(p3);delete p4;A* p5 = (A*)malloc(sizeof(A)*10);A* p6 = new A[10];free(p5);delete[] p6;return 0;}
注意:在申請自定義類型的空間時,new會調(diào)用構(gòu)造函數(shù),delete會調(diào)用析構(gòu)函數(shù),而malloc與free不會。
new開辟空間失敗會拋異常,不需要手動檢查
拋異常 捕獲異常