c++中記憶體分割槽
阿新 • • 發佈:2020-10-04
c++中記憶體分割槽
概述
c++在程式執行過程中,將記憶體大體分為四個區域:
- 程式碼區:存放函式體的二進位制程式碼,由作業系統管理
- 全域性區:存放全域性變數和靜態變數以及常量
- 棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數等
- 堆區:由程式設計師分配釋放(delete)和分配(new) ,程式結束會由作業系統回收
程式執行前
程式編譯後會生成exe可執行程式,未執行該程式前可分為兩個區域:
程式碼區
存放CPU的執行的機器指令
程式碼區是共享只讀的,共享的目的是便於在頻繁執行程式過程中,只需要訪問一份程式碼,減少一定的記憶體開銷。 只讀可以防止程式意外的修改指令
全域性區:
存放全域性變數和靜態變數
全域性區還包含了常量區,字串常量和其他常量
示例:
//全域性變數 int global_varA = 10; int global_varB = 10; const int const_global_a = 1; const int const_global_b = 1; int main(int argc, char const *argv[]) { // 區域性變數 int a = 10; int b = 10; std::cout << "區域性變數a的地址:" << &a << std::endl; std::cout << "區域性變數b的地址:" << &b << std::endl; std::cout << "-----------------------------------------" << std::endl; //全域性變數 std::cout << "全域性變數global_varA的地址為:" << &global_varA << std::endl; std::cout << "全域性變數global_varB的地址為:" << &global_varB << std::endl; std::cout << "-----------------------------------------" << std::endl; //靜態變數 static int static_A = 1, static_B = 1; cout << "靜態變數static_A的地址為: " << &static_A << endl; cout << "靜態變數static_B的地址為: " << &static_B << endl; std::cout << "-----------------------------------------" << std::endl; cout << "字串常量地址為: " << &"hello world!" << endl; std::cout << "-----------------------------------------" << std::endl; // 全域性靜態常量 cout << "全域性常量const_global_a的地址為: " << &const_global_a << endl; cout << "全域性常量const_global_b的地址為: " << &const_global_b << endl; std::cout << "-----------------------------------------" << std::endl; // 區域性靜態常量 const int l_g_a = 1; const int l_g_b = 1; cout << "區域性常量l_g_a的地址為: " << &l_g_a << endl; cout << "區域性常量l_g_b的地址為: " << &l_g_b << endl; return 0; }
程式執行後
棧區:
* 由編譯器自動分配釋放, 存放函式的引數值,區域性變數等
* 注意:函式不能返回區域性變數的地址
示例:
#include <iostream> using namespace std; #include <math.h> int* fun() { int a = 110;//區域性變數存在棧區,函式執行完後自動釋放 return &a;//返回區域性變數地址 } int main(int argc, char const* argv[]) { int* p = fun(); cout << *p << endl; cout << *p << endl; // system("pause"); return 0; }
堆區:
* c++中用new來開闢相關型別的記憶體, deletee 來釋放
* 由程式設計師分配和釋放,如果程式設計師不釋放,那麼程式結束時將由作業系統回收
示例:
#include <iostream>
using namespace std;
#include <math.h>
int* fun()
{
int* p = new int(101);
return p;
}
int main(int argc, char const* argv[])
{
int* p = fun();
cout << *p << endl;
cout << *p << endl;
cout << *p << endl;
delete p;//釋放記憶體
cout << *p << endl;//輸出的值和上方不一樣
// system("pause");
return 0;
}