1. 程式人生 > 實用技巧 >C++記憶體管理

C++記憶體管理

C++中記憶體可以分為5部分:

全域性/靜態儲存區、常量儲存區、棧(stack)、堆(heap)、自由儲存區(freestore)

全域性/靜態儲存區:

定義在花括號外{ }的變數、或是使用static修飾的變數。

常量儲存區:

如字串常量“ABC”等,通常存放在常量儲存區。

棧(stack):

花括號{ }內定義的變數、函式的形參等。

程式執行到花括號內時,變數建立在棧上,當括號內程式執行結束,棧上的變數由編譯器自動釋放。

堆(heap):

malloc分配的記憶體塊。

自由儲存區(freestore):

new分配的記憶體塊。

棧與堆

棧由編譯器自動管理,堆由程式設計師管理。

預設的棧空間大小是1M,堆記憶體可以達到4G的空間,其大小可以修改(?)。

棧一般情況下不會產生碎片,堆很有可能會產生碎片。

堆與自由儲存區的區別(並不等價)

堆(heap)是C語言和作業系統的術語。堆是作業系統所維護的一塊特殊記憶體,它提供了動態分配的功能,當執行程式呼叫malloc()時就會從中分配,稍後呼叫free可把記憶體交還。

自由儲存是C++中通過new和delete動態分配和釋放物件的抽象概念,通過new來申請的記憶體區域可稱為自由儲存區。

如下使用一個例子最直觀

#include<iostream>
#include<string>
using namespace
std; int global_par; //全域性變數 預設初始化為0 int main() { int local_par=0; //區域性變數 不會初始化 最好進行初始化 static int static_par=0; //靜態區域性變數 int *q1 =(int *)malloc(int(1)); //指標q1本身是區域性變數 malloc在堆上開閉空間 int *q2 = (int *)malloc(int(10)); int *p1 = new int(1); //指標p1本身是區域性變數 new在自由儲存區上開閉空間
int *p2 = new int(10); cout << "-----全域性/靜態儲存區----" << endl; cout << "global_par地址:" << &global_par << endl; cout << "static_par地址:" << &static_par << endl; cout << endl; cout << "-----常量儲存區-----" << endl; cout << "A地址:" << &"A" << endl; cout << "e地址:" << &"e" << endl; cout << endl; cout << "-------棧-------" << endl; cout << "local_par地址:" << &local_par << endl; cout << "*q1地址:" << &q1 << endl; cout << "*q2地址:" << &q2 << endl; cout << "*p1地址:" << &p1 << endl; cout << "*p2地址:" << &p2 << endl; cout << endl; cout << "--------堆--------" << endl; cout << "(int *)malloc(int(1))的地址:" << q1 << endl; cout << "(int *)malloc(int(10))的地址:" << q2 << endl; cout << endl; cout << "-----自由儲存區-----" << endl; cout << "new int(1)的地址:" << p1 << endl; cout << "new int(10)的地址:" << p2 << endl; cout << endl; free(q1); free(q2); delete p1; delete p2; system("pause"); return 0; }

執行結果如下:

從上圖中的不同變數的地址可以看出不同型別變數地區儲存在不同區域。

相關連結:

https://www.cnblogs.com/QG-whz/p/5060894.html

https://blog.csdn.net/caogenwangbaoqiang/article/details/79788368