c++在程序執行的時候將內存分為四個區:
1.代碼區
存放函數體的二進制代碼,由操作系統管理
包括你寫的那些注釋都在這
2.全局區
存放全局變量,靜態變量,常量
常量:字符串常量
3.棧區
存放函數參數值和局部變量,由編譯器自動分配和釋放
4.堆區
由程序員分配和釋放,如果程序員不釋放,那么程序結束時將由操作系統回收
那么為什么要分為四個區呢?
因為不同區域存放的數據,具有不同生命周期,這大大地使我們編程更加靈活
代碼區的特點
存放cpu執行的機器指令
共享(生成一份exe文件即可),只讀(防止程序意外地修改指令)
全局區:
它和代碼區都是在程序執行前弄好的
該區域的數據在程序結束后有操作系統回收
存放全局變量,靜態變量,常量
下面做一些演示
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int g_a = 1,g_b = 1; 5 const int c_g_a = 1; 6 const int c_g_b = 1; 7 int main() 8 { 9 int a = 1,b = 1; 10 cout << "局部變量a的地址為: " << &a << endl; 11 cout << "局部變量b的地址為: " << &b << endl; 12 13 cout << "全局變量g_a的地址為: " << &g_a << endl; 14 cout << "全局變量g_b的地址為: " << &g_b << endl; 15 16 static int s_a = 1,s_b = 1; 17 cout << "靜態變量s_a的地址為: " << &s_a << endl; 18 cout << "靜態變量s_b的地址為: " << &s_b << endl; 19 20 cout << "字符串常量地址為: " << &"hello world!" << endl; 21 22 const int l_g_a = 1; 23 const int l_g_b = 1; 24 cout << "全局常量c_g_a的地址為: " << &c_g_a << endl; 25 cout << "全局常量c_g_b的地址為: " << &c_g_b << endl; 26 27 cout << "局部常量l_g_a的地址為: " << &l_g_a << endl; 28 cout << "局部常量l_g_b的地址為: " << &l_g_b << endl; 29 return 0; 30 }
運行之后看每個變量的地址形式就發現異同了
我的有亂碼
3.棧區
存放函數參數值和局部變量,由編譯器自動分配和釋放
需要注意的是函數不能返回局部變量的地址
為什么呢?
看一下下面的代碼
#include<bits/stdc++.h>
using namespace std;
int *fun()
{
int a = 110;//局部變量存在棧區,函數執行完后自動釋放
return &a;//返回局部變量地址
}
int main()
{
int *p = fun();
cout << *p << endl;
cout << *p << endl;
return 0;
}
為什么第一次輸出是對的而第二次輸出是錯的?
因為編譯器會幫你保留一次這個數據,但不會一直保留。
4.堆區
有程序員分配和釋放,如果程序員不釋放,那么程序結束時將由操作系統回收
c++中用new來開辟相關類型的內存
delet 來釋放
來看看代碼
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int *fun() 5 { 6 int *p = new int(101); 7 return p; 8 } 9 10 int main() 11 { 12 int *p = fun(); 13 cout << *p << endl; 14 cout << *p << endl; 15 cout << *p << endl; 16 cout << *p << endl; 17 return 0; 18 }
看到沒有四次輸出都一樣,因為在這地方我們並沒有釋放