C++ 動態內存【學習筆記】

1. 內存分佈

  • 靜態內存:局部static對象、類static數據成員、定義在任何函數之外的變量;使用之前分配內存,程序結束時銷燬;
  • 棧內存:函數內的非static對象;僅在程序塊運行時才存在;
  • 堆:存儲動態分配對象;

2. 直接管理內存

new動態分配內存、初始化

  • 使用new動態分配內存返回一個內置指針
  • 動態分配的對象是默認初始化的,即內置類型不初始化(未定義的),類類型執行默認構造函數;
string *ps=new string;//ps指向一個動態分配的,初始化爲空string的對象
int *pi=new int;//pi指向一個動態分配,未初始化的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();  //值初始化爲0
string *ps=new string();//值初始化爲空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釋放動態數組

  • delete [] p;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章