鍍金池/ 教程/ C/ 動態(tài)內(nèi)存
動態(tài)內(nèi)存
類和對象
接口 (抽象類)
結(jié)構(gòu)體
循環(huán)的類型
函數(shù)
數(shù)字
日期和時間
基本語法
多態(tài)
數(shù)據(jù)抽象
注釋
命名空間
字符串
預(yù)處理器
決策語句
修飾符的類型
鍙橀噺綾誨瀷
基本輸入輸出
操作符
數(shù)組
模板
多線程
繼承
Web 編程
信號處理
指針
存儲類型
概述
引用
常量
異常處理
開發(fā)環(huán)境
重載
變量作用域
數(shù)據(jù)類型
數(shù)據(jù)封裝
文件和流

動態(tài)內(nèi)存

很好地理解動態(tài)內(nèi)存到底如何在 C++ 中發(fā)揮作用是成為一個好的 C++ 程序員所必需的。 C++ 程序中的內(nèi)存分為兩個部分:

  • 棧:所有函數(shù)內(nèi)部聲明的變量會占用棧的內(nèi)存?!   ?/li>
  • 堆:這是程序中未使用的內(nèi)存,可以在程序運(yùn)行時動態(tài)地分配內(nèi)存。

很多時候,你事先不知道你在一個定義的變量中需要多少內(nèi)存來存儲特定的信息以及在程序運(yùn)行時所需內(nèi)存的大小。

你可以在運(yùn)行時為指定類型的變量分配堆內(nèi)存,并且可以使用 C++ 中特殊操作符返回分配空間的地址。這個操作符被稱為 new 操作符。

如果你不再需要動態(tài)分配內(nèi)存了,你可以使用 delete 操作符來釋放之前用 new 操作符分配的內(nèi)存。

new 和 delete 操作符

下面是使用 new 操作符為任意數(shù)據(jù)類型動態(tài)地分配內(nèi)存的通用的語法。

    new data-type;

這里, data-type 可以是任何內(nèi)置數(shù)據(jù)類型,包括數(shù)組或任何用戶定義的數(shù)據(jù)類型包括類或結(jié)構(gòu)。讓我們先看看內(nèi)置的數(shù)據(jù)類型。例如,我們可以定義一個 double 類型的指針然后在程序執(zhí)行時請求分配內(nèi)存。我們可以使用 new 操作符來完成它,程序語句如下:

    double* pvalue  = NULL; // Pointer initialized with null
    pvalue  = new double;   // Request memory for the variable

如果自由存儲區(qū)都已經(jīng)被占用,內(nèi)存可能就不能被成功分配。因此檢查 new 操作符是否返回空指針是一種很好的做法,并且要采取適當(dāng)?shù)拇胧┤缦拢?/p>

    double* pvalue  = NULL;
    if( !(pvalue  = new double ))
    {
       cout << "Error: out of memory." <<endl;
       exit(1);

    }

C 語言中的 malloc() 函數(shù)在C++中仍然存在,但是建議避免使用 malloc() 函數(shù)。相對于 malloc() 函數(shù) new 操作符的主要優(yōu)勢是 new 操作符不僅分配內(nèi)存,它還可以構(gòu)造對象,而這正是 C++ 的主要目的?!   ?/p>

在任何時候,當(dāng)你覺得一個變量已經(jīng)不再需要動態(tài)分配,你可以用 delete 操作符來釋放它在自由存儲區(qū)所占用的內(nèi)存,如下:

    delete pvalue;// Release memory pointed to by pvalue

讓我們把理解一下這些概念,并且用下面的例子來說明 new 和 delete 是如何起作用的:

    #include <iostream>
    using namespace std;

    int main ()
    {
       double* pvalue  = NULL; // Pointer initialized with null
       pvalue  = new double;   // Request memory for the variable

       *pvalue = 29494.99; // Store value at allocated address
       cout << "Value of pvalue : " << *pvalue << endl;

       delete pvalue; // free up the memory.

       return 0;
    }

如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:

    Value of pvalue : 29495

數(shù)組的動態(tài)內(nèi)存分配

考慮到你想要為字符數(shù)組分配內(nèi)存,即 20 個字符的字符串。使用與上面相同的語法我們可以動態(tài)地分配內(nèi)存,如下所示。

    char* pvalue  = NULL;   // Pointer initialized with null
    pvalue  = new char[20]; // Request memory for the variable

應(yīng)該像這樣刪除我們剛剛創(chuàng)建的數(shù)組聲明:

    delete [] pvalue;// Delete array pointed to by pvalue

學(xué)習(xí)過 new 操作符的類似通用語法,你可以為一個多維數(shù)組分配內(nèi)存如下:

    double** pvalue  = NULL; // Pointer initialized with null
    pvalue  、= new double [3][4]; // Allocate memory for a 3x4 array

然而,釋放多維數(shù)組內(nèi)存的語法仍然同上:

    delete [] pvalue;// Delete array pointed to by pvalue

對象的動態(tài)內(nèi)存分配

對象與簡單的數(shù)據(jù)類型并無不同。例如,考慮下面的代碼,我們將使用一個對象數(shù)組來解釋這個概念:

    #include <iostream>
    using namespace std;

    class Box
    {
       public:
      Box() { 
     cout << "Constructor called!" <<endl; 
      }
      ~Box() { 
     cout << "Destructor called!" <<endl; 
      }
    };

    int main( )
    {
       Box* myBoxArray = new Box[4];

       delete [] myBoxArray; // Delete array

       return 0;
    }

如果你為四個 Box 對象數(shù)組分配內(nèi)存,一個簡單的構(gòu)造函數(shù)將被調(diào)用四次,同樣的刪除這些對象時,析構(gòu)函數(shù)也被調(diào)用相同的次數(shù)。

如果我們編譯和運(yùn)行上面的代碼,這將產(chǎn)生以下結(jié)果:

    Constructor called!
    Constructor called!
    Constructor called!
    Constructor called!
    Destructor called!
    Destructor called!
    Destructor called!
    Destructor called!