儲存持續性 作用域和鏈結性之二

2022-07-11 01:21:07 字數 2172 閱讀 5944

除了執行緒儲存持續性,c++使用三種不同的方案來儲存資料,這些方案的區別就在於資料保留在記憶體中的時間。

使用c++運算子new(或c函式malloc())分配的記憶體,被成為動態記憶體。動態記憶體由運算子newdelete控制,不是由作用域和鏈結性規則控制。因此,可以在乙個函式中動態分配記憶體,而在另乙個函式中將其釋放。其分配和釋放的順序取決於newdelete在何時以何種方式被使用。

雖然儲存方案概念不適用於動態記憶體,但適用於用來跟蹤動態記憶體的自動和靜態指標變數。例如,假設在乙個函式中包含下面的語句:

float * p_fees = new float [20];
new分配的80個位元組(假設float 為4個位元組)的記憶體將一直保留在記憶體中,直到使用delete運算子將其釋放。但當包含該宣告的語句塊執行完畢時,p_fees指標將消失。如果希望另乙個函式能夠使用這80個位元組中的內容,則必須將其位址傳遞或返回給該函式。另一方面,如果將p_fees 的鏈結性宣告為外部的,則檔案中位於該宣告後面的所有函式都可以使用它。另外,通過在另乙個檔案中使用下述宣告,便可在其中使用該指標:

extern float * p_fees;
如果要為內建的標量型別(如intdouble)分配儲存空間並初始化,可在型別名後面加上初始值,並將其用括號括起:

int *pi = new int (6); // *pi set to 6

double * pd = new double (99.99); // *pd set to 99.99

然而,要初始化常規結構或陣列,需要使用大括號的列表初始化,這要求編譯器支援c++11。c++11允許您這樣做:

struct where ;

where * one = new where ; // c++11

int * ar = new int [4] ; // c++11

在c++11中,還可將列表初始化用於單值變數:

int *pi = new int ; // *pi set to 6

double * pd = new double ; // *pd set to 99.99

new可能找不到請求的記憶體量。在最初的10年中,c++在這種情況下讓 new返回空指標,但現在將引發異常std:.bad_alloc。

通常,new負責在堆(heap)中找到乙個足以能夠滿足要求的記憶體塊。new運算子還有另一種變體,被稱為定位(placement) new運算子,它讓您能夠指定要使用的位置。程式設計師可能使用這種特性來設定其記憶體管理規程、處理需要通過特定位址進行訪問的硬體或在特定位置建立物件。即定位new運算子可以在指定位址建立物件、將指定記憶體分配給指定物件。

#include struct chaff

;char buffer1[50]

char buffer2[500];

int main()

注意,buffer1buffer2都位於delete的管轄區域之外,不能使用delete釋放記憶體塊。另一方面,如果buffer是使用常規new運算子建立的,便可以使用常規delete運算子來釋放整個記憶體塊。

定位new運算子的另一種用法是,將其與初始化結合使用,從而將資訊放在特定的硬體位址處。

int * pi = new int;                 // invokes new(sizeof (int))

int * p2 = new(buffer) int; // invokes new(sizeof(int),buffer)

int * p3 = new(buffer) int [40]; // invokes new(40*sizeof(int), buffer)

儲存持續性 作用域和鏈結性

關於記憶體的知識 c 使用3種 c 11中是4種 不同的方案來儲存資料,這些方案的區別在於資料保留在記憶體中的時間。1.自動變數和棧 自動變數的數目隨函式的開始和結束而增減,因此程式必須在執行時對自動變數進行管理,常用的方法是留出一段記憶體,將其視為棧,以管理動態變數的增減。2.靜態持續變數 和c語...

變數儲存持續性 作用域和鏈結性

靜態持續變數3種鏈結性 外部鏈結性 可在其他檔案中訪問 內部鏈結性 只能在當前檔案中訪問 無鏈結性 只能在當前函式或 中訪問 要想建立鏈結性為外部或內部的靜態持續變數,必須在 塊外面宣告它,要建立沒有鏈結性的靜態持續變數,必須在 塊內宣告它。1.單定義規則 變數只能有一次定義,c 提供了兩種變數宣告...

C 儲存持續性 作用域與鏈結性

簡介 c 使用三種 c 11之後是四種 不同的方案來儲存資料,這些方案的區別就在於資料保留在記憶體中的時間。詳解 自動儲存持續性 在函式定義中宣告的變數 包括原函式引數 的儲存持續性為自動的。它們在程式開始執行其所屬的函式或 塊時被建立,在執行完函式或 塊時,它們使用的記憶體被釋放。靜態儲存持續性 ...