C 使用new來分配記憶體

2022-09-24 13:33:17 字數 2994 閱讀 6863

對位址的工作方式有一定了解後,來看看它如何實現在程式執行時分配記憶體。前面我們都將指標初始化為變數的位址;變數是在編譯時分配的有名稱的記憶體,而指標只是為可以用過名稱直接訪問的記憶體提供了乙個別名。指標真正的用武之地在於,在執行階段分配未命名的記憶體以儲存值。在這種情況下,只能通過指標來訪問。在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

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++提供了檢測並處理記憶體分配失敗的工具。

c 中使用new來分配記憶體

指標初始化為變數的位址,比如 int pt higgens 這時候變數在程式編譯的時分配的有名稱的記憶體,指標只是為可以通過名稱直接訪問的記憶體提供乙個別名。其實指標真正的厲害在於,在執行階段分配未命名的記憶體以儲存,在這種情況下,只能通過指標來訪問記憶體 在c語言中,可以用庫函式malloc 來分...

4 7 4 使用new來分配記憶體

前面,我們將指標初始化為變數的位址 變數是在編譯時分配的 有名稱的記憶體,而指標只是為可以通過名稱直接訪問的記憶體提供了乙個別名。指標真正的用武之地在於,在執行階段分配未命名的記憶體以儲存值。在這種情況下,只能通過指標來訪問記憶體。new的用法 int pn new int new int告訴程式,...

c 中用new分配記憶體

new的作用和使用方法如下 new的作用在於可以在程式執行階段動態分配記憶體,記憶體的大小在執行時根據需要確定,從而 高效利用記憶體空間。new的使用方法如下 typename pointer name new typename使用時使用者需要指定型別 指標型別和要開闢的記憶體儲存的資料型別 new...