C++ 使用new來分配內存


  對地址的工作方式有一定了解后,來看看它如何實現在程序運行時分配內存。前面我們都將指針初始化為變量的地址;變量是在編譯時分配的有名稱的內存,而指針只是為可以用過名稱直接訪問的內存提供了一個別名。指針真正的用武之地在於,在運行階段分配未命名的內存以存儲值。在這種情況下,只能通過指針來訪問。在C語言中,可以用庫函數malloc()來分配內存;在C++中仍然可以這樣做,但C++還有更好的方法——new運算符。

  下面來試試這種新技術,在運行階段為一個int值分配未命名的內存,並使用指針來訪問這個值。這里的關鍵所在是C++的new運算符。程序員要告訴new,需要為哪種數據類型分配內存;new將找到一個長度正確的內存塊,並返回該內存塊的地址。程序員的責任是將該地址賦給一個指針。下面是一個這樣的示例:

  int * pn = new int;

  new int告訴程序,需要適合存儲int的內存。new運算符根據類型來確定需要多少字節的內存。然后,他找到這樣的內存,並返回其地址,接下來,將地址賦給pn,pn是被聲明為指向int的指針。現在,pn是地址,而*pn是存儲在那里的值。將這種方法與將變量的地址賦給指針進行比較:

  int higgens;

  int * pt = &higgens;

  在這兩種情況,(pn和pt)下,都是將一個int變量的地址賦給了指針。在第二種情況下,可以通過名稱higgens來訪問該int,在第一種情況下,則只能通過該指針進行訪問。這引出了一個問題:pn指向的內存沒有名稱,如何稱呼它呢?我們說pn指向一個數據對象,這里的“對象”不是“面向對象編程”中的對象,而是一樣“東西”。術語“數據對象”比“變量”更通用,它是的是為數據項分配的內存塊。因此,變量也是數據對象,但pn指向的內存不是變量。乍一看,處理數據對象的指針方法可能不太好用,但它使程序在管理內存方面有更大的控制權。

  為一個數據對象(可以是結構,也可以是基本類型)獲得並指定分配內存的通用格式如下:

  typeName * pointer_name = new typeName;

  需要在兩個地方指定數據類型:用來指定需要什么樣的內存和用來聲明合適的指針。當然,如果已經聲明了相應類型的指針,則可以使用該指針,而不用再聲明一個新的指針。以下程序演示了如何將new 用於兩種不同的類型。

  

#include <iostream>
int main()
{
using namespace std;
int nights = 1001;
int* pt = new int; //allocation space for an int
*pt = 1001; // store a value there

cout << "nights value = ";
cout << nights << ": location = " << &nights << endl;
cout << "int ";
cout << "value = " << *pt << ": location = " << pt << endl;
double* pd = new double; // allocate space for a double
*pd = 1000001.0; // store a double there

cout << "double ";
cout << "value = " << *pd << " : location = " << pd << endl;
cout << "location of pointer pd: " << &pd << endl;
//cout << "size of pt = " << sizeof(pt);
cout << "size of pt = " << sizeof pt;
cout << ": size of *pt = " << sizeof(*pt) << endl;
cout << "size of pd = " << sizeof pd;
cout << ": size of *pd = " << sizeof (*pd) << endl;
return 0;

}

  下面是該程序的輸出:

  nights value = 1001: location = 0113F864
  int value = 1001: location = 0153A138
  double value = 1e+06 : location = 01544338
  location of pointer pd: 0113F84C
  size of pt = 4: size of *pt = 4
  size of pd = 4: size of *pd = 8

  當然,內存位置的標准值對系統而異。

  程序說明

  該程序使用new分別為int類型和double類型的數據對象分配內存。這是在程序運行時進行的。指針 pt 和 pd 指向這兩個數據對象。如果沒有它們,將無法訪問這些內存單元。有了這兩個指針,就可以像使用變量那樣使用*pt和*pd來顯示這些值。

  該程序還指出了必須聲明指針所指向的類型的原因之一。地址本身只指出了對象存儲地址的開始,而沒有指出其類型(使用的字節數)。從這兩個值的地址可以知道,它們都只是數字,並沒有提供類型或長度信息。另外,指向int的指針的長度與指向double的指針相同。它們都是地址,但由於use_new.cpp聲明了指針的類型,因此程序知道*pd是8個字節的double值,*pt是4個字節的int值。use_new.cpp打印*pd的值時,cout知道讀取多少字節以及如何解釋它們。

  對於指針,需要指出的另一點是,new分配的內存塊通常與常規變量聲明分配的內存塊不同。變量nights和pd的值都存儲在被稱為棧(stack)的內存域中,而new從被稱為堆(heap)或自由存儲區(free store)的內存區域分配內存。

  內存被耗盡?

  計算機可能會由於沒有足夠的內存而無法滿足new的請求。在這種情況下,new通常會引發異常,而在較老的實現中,new將返回0。在C++中,值為0的指針被稱為空指針(null pointer)。C++確保空指針不會指向有效的數據,因此它常被用來表示運算符或函數失敗(如果成功,它們將返回一個有用的指針)。將在if語句可幫助您處理這種問題;就目前而言,您只需如下要點:C++提供了檢測並處理內存分配失敗的工具。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM