1. 記憶體管理
1.1 全域性區
1 #include<iostream> 2 using namespace std; 3 4 // 全域性變數 5 int g_a = 10; 6 int g_b = 10; 7 8 // const修飾的全域性變數,全域性常量 9 const int c_g_a = 10; 10 const int c_g_b = 10; 11 12 int main() { 13 14 //全域性區 15 16 //全域性變數、靜態變數、常量 17 //常量:字串常量、const修飾的全域性變數 18 19 //建立普通區域性變數 20 int a = 10; 21 int b = 10; 22 23 cout << "區域性變數a的地址為: " << (int)&a << endl; 24 cout << "區域性變數b的地址為: " << (int)&b << endl; 25 cout << "全域性變數g_a的地址為: " << (int)&g_a << endl; 26 cout << "全域性變數g_b的地址為: " << (int)&g_b << endl; 27 28 29 // 靜態變數 加static 30 static int s_a = 10; 31 static int s_b = 10; 32 cout << "靜態變數s_a的地址為: " << (int)&s_a << endl; 33 cout << "靜態變數s_b的地址為: " << (int)&s_b << endl; 34 35 36 // 常量 37 // 字串常量 38 cout << "字串常量的地址為: " << (int)&"hello world!" << endl; 39 40 41 // const修飾的變數 42 //const修飾的全域性變數 43 cout << "const修飾的全域性變數c_g_a的地址為: " << (int)&c_g_a << endl; 44 cout << "const修飾的全域性變數c_g_b的地址為: " << (int)&c_g_b << endl; 45 46 //const修飾的區域性變數 47 const int c_l_a = 10; 48 const int c_l_b = 10; 49 50 cout << "const修飾的區域性變數c_l_a的地址為: " << (int)&c_l_a << endl; 51 cout << "const修飾的區域性變數c_l_b的地址為: " << (int)&c_l_b << endl; 52 53 system("pause"); 54 55 return 0; 56 } 57 58 //總結 59 //記憶體四區:程式碼去(程式執行前)、全域性區(程式執行前)、棧區、堆區 60 //程式碼區:存放CPU指令,共享+只讀的特點 61 //全域性區:全域性變數、靜態變數、常量(字串常量、const修飾的全域性變數(全域性常量)) 62 //全域性區的資料再程式結束後由系統釋放
1.2 棧區
1 #include<iostream> 2 using namespace std; 3 4 // 棧區資料注意事項 --不要返回區域性變數的地址 5 // 棧區的資料由編譯器管理開闢和釋放 6 // 形引數據也放在棧區 7 8 int* func() { 9 int a = 10; //區域性變數 存放在棧區,棧區的資料在函式執行完成後自動釋放 10 return &a; //返回區域性變數的地址,錯誤示例 11 } 12 13 int main() { 14 15 //使用指標接受func函式的返回值 16 //int* p = func(); 17 //cout << *p << endl; 18 //程式報錯“返回區域性變數或臨時變數的的地址” 19 20 system("pause"); 21 22 return 0; 23 } 24 25 //總結 26 //棧區:編譯器自動分配與釋放,存放函式的引數值、區域性變數 27 //注意:不能返回區域性變數的地址,棧區開闢的資料由編譯器自動釋放
1.3 堆區
1 #include<iostream> 2 using namespace std; 3 4 int* func() { 5 //利用new關鍵字 可以將資料開闢到堆區,delete關鍵字用來釋放 6 7 //new int(10); 建立堆區資料,初始化為10,產生該資料的地址 8 //可以使用指標來接收 9 10 //指標的本質是區域性變數,存放在棧區,指標儲存的資料存放在堆區 11 12 int* p = new int(10); 13 14 return p; 15 16 } 17 18 int main() { 19 20 //在堆區開闢資料 21 int* p = func(); 22 23 cout << *p << endl; 24 cout << *p << endl; 25 26 system("pause"); 27 28 return 0; 29 30 } 31 32 //總結 33 //堆區資料由程式設計師管理開闢和釋放 34 //堆區資料利用new關鍵字進行開闢記憶體,並返回地址 35 //new開闢的堆區記憶體通過delete關鍵字進行釋放
1.4 new操作符
1 #include<iostream> 2 using namespace std; 3 4 //1、new的基本語法 5 int* func() { 6 //在堆區建立整型資料 7 //new返回的是 該資料型別的指標 8 int* p = new int(10); 9 return p; 10 } 11 12 void test01() { 13 int* p = func(); 14 cout << *p << endl; 15 cout << *p << endl; 16 cout << *p << endl; 17 //堆區資料 由程式設計師管理開闢,程式設計師管理釋放; 18 //如果想釋放堆區資料,利用關鍵字 delete; 19 20 delete p; 21 //cout << *p << endl;//記憶體已經被釋放,再次訪問就是非法操作,會報錯; 22 } 23 24 //2、在堆區利用new開闢陣列 25 26 27 void test02() { 28 //在堆區,建立10整型資料的陣列 29 //使用[]在堆區建立陣列 30 int* arr = new int[10]; //10表示陣列有10個元素 31 for (int i = 0; i < 10; i++) { 32 arr[i] = i + 100; //給是個元素賦值 100~109 33 } 34 35 for (int i = 0; i < 10; i++) { 36 cout << arr[i] << endl; 37 } 38 39 //釋放堆區數字 40 //釋放陣列要記得加[],表示釋放陣列 41 delete[] arr; 42 } 43 44 45 int main() { 46 47 //test01(); 48 test02(); 49 system("pause"); 50 return 0; 51 } 52 53 54 55 56 //總結 57 //C++利用new關鍵字開闢堆區資料 58 //堆區資料由程式設計師手動開闢,手動釋放,關鍵字delete 59 // 語法:new 資料型別 60 // 利用new建立的資料,會返回該資料對應型別的指標 61 //
參考:《黑馬程式設計師》C++教程