1. 內存分佈
- 靜態內存:局部static對象、類static數據成員、定義在任何函數之外的變量;使用之前分配內存,程序結束時銷燬;
- 棧內存:函數內的非static對象;僅在程序塊運行時才存在;
- 堆:存儲動態分配對象;
2. 直接管理內存
new動態分配內存、初始化
- 使用new動態分配內存返回一個內置指針
- 動態分配的對象是默認初始化的,即內置類型不初始化(未定義的),類類型執行默認構造函數;
string *ps=new string;
int *pi=new int;
int *pi=new int(1024);
string *ps=new string(10,'9');
vector<int> *pv=new vector<int>{0,1,2,3,4,5,6};
int *pi=new int();
string *ps=new string();
內存耗盡
- 對於
int *pi=new int;
,如果分配失敗,new拋出std::bad_alloc
- 對於
int *p = new (nothrow) int;
,如果分配失敗,p指針爲空指針:
delete釋放動態內存
delete p;
p必須是一個指向動態分配對象的指針或者是一個空指針;
- delete執行的兩個動作:銷燬指針指向的對象,釋放對應的內存;
- 未定義的行爲:釋放一個非new生成的指針,或者相同的指針釋放多次;
- 由內置指針管理的動態內存在被顯式釋放前會一直存在;
- 指針被delete之後,就變成了空懸指針,爲了安全,最好將空懸指針置爲空指針nullptr;
share_ptr和new結合使用:
- 智能指針類定義中,接受內置指針參數的構造函數是explicit的,即不存在內置指針到智能指針的隱式轉換,因此智能指針初始化的時候必須直接初始化,不能拷貝初始化:
shared_ptr<int> p1 = new int(1024);
shared_ptr<int> p2(new int(1024));
new動態數組
int *p=new int[42];
delete釋放動態數組