C++基礎-1-記憶體管理(全域性區、堆區、棧區)

Thomas_kaka發表於2022-04-30

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++教程

相關文章