c++之A a和A *a=new A()

來源:互聯網
上載者:User

      new是在堆上分配記憶體,它需要用delete釋放,否則會造成記憶體流失。

      A a 在程式執行完畢後,會自動釋放記憶體。

      int main(){

      A a;//定義了一個對象

      A *p=new A(); //在堆上定義了一個對象,它的指標儲存在p裡;堆上定義的對象沒有名字,必須用指標儲存。

      return 0;

      }// a 到這裡的時候,它佔用的記憶體會被釋放,而p,除非調用 delete p,否則記憶體永遠不會被回收,指標p丟棄後,

      // 那塊記憶體沒被釋放,無法被再次使用,造成記憶體浪費

動態分配記憶體new 關鍵字

       1 動態分配記憶體,將從堆中分配記憶體。局部變數一般儲存在堆棧中。

       2 使用new將從空閑儲存區中為對象分配記憶體,並返回一個指向該對象的指標即該對象的地址。new運算子的特點:

          用new運算子分配的對象沒有名字,對該對象的操作都要通過指標間接的完成。

       3 動態建立數組:int *p=new int[11];

       4 耗盡記憶體:如果程式用完了所有可用的記憶體,new運算式就有可能失敗。如果new運算式無法獲得需要的記憶體空間。系統將會拋出名為bad_alloc 異常。

       5 懸垂指標:執行delete p 後只是把p指向的內容銷毀了,並沒有刪除指標p本身,還可以將p重新指向到另一塊新的記憶體塊,因此p還指向原來他指向的對象的地址,然而p所指向的內容給銷毀釋放掉了,因此p不再有效而變得沒有意義。

       6 常見錯誤:如果對某個指標動態分配了記憶體,又把另一個變數的地址付給了這個指標,這時這個指標就指向了一個靜態地址,而不是原來的動態地址。這時候用delete刪掉這個指標的時候就會報錯,因為delete不能刪除靜態指標。

#include <iostream>using namespace std;class hyong {public:int a, b, c;hyong() {a = b = c = 0;}hyong(int i) {a = b = c = i;}~hyong() {cout << "xigou" << "/n";}};int main() {hyong *p = new hyong;hyong *p1 = new hyong();cout << p->a << p1->a <<endl; //輸出兩個0,都調用預設建構函式初始化指標。int *p2 = new int;int *p3 = new int();int *p4 = new int(1); //new分配記憶體的初始化方式。//對於類置類型來說p2沒有被初始化得到的是一個隨機值, p3被初始化為0//,p4被初始化為1。cout<<*p2<<endl<<*p3<<endl<<*p4<<endl;  //輸出一個隨機值,一個0,一個1int i = 10;delete p4;cout << *p4 << endl; //p4現在是懸垂指標,delete只是釋放掉了指標p4所指向地址的內容,//但指標p4仍然指向原來的地址, 但沒有內容,指標p4仍然可以再指向其他地址。p4 = &i;cout << *p4 << endl; //可以對懸垂指標p4重新賦地址。const int *p5 = new int;const int *p6 = new int(4);cout << *p5 << *p6 << endl; //輸出一個隨機值和4,const常量必須在聲明時初始化。int *p7 = new int[2];p7[0] = 5;p7[1] = 6;cout << p7[0] << p7[1] <<endl; //定義動態數組//const int *p8=new int[2];  //錯誤,因為動態數組不能在聲明時初始化,而const又必須要求在聲明時初始化,發生衝突,出錯。delete p1;delete p;//delete p,p1;   //注意,如果使用該語句將則只調用一次解構函式。delete p2, p3, p4, p5, p6;delete[] p7;//int *p8=new int(9); int a=8;  p8=&a; delete p8;  //錯誤,現在的指標p8重新指向了一個靜態地址,//用delete刪掉一個靜態地址將發生錯誤}




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.