除了執行緒儲存持續性,c++使用三種不同的方案來儲存資料,這些方案的區別就在於資料保留在記憶體中的時間。
使用c++運算子new
(或c函式malloc()
)分配的記憶體,被成為動態記憶體。動態記憶體由運算子new
和delete
控制,不是由作用域和鏈結性規則控制。因此,可以在乙個函式中動態分配記憶體,而在另乙個函式中將其釋放。其分配和釋放的順序取決於new
和delete
在何時以何種方式被使用。
雖然儲存方案概念不適用於動態記憶體,但適用於用來跟蹤動態記憶體的自動和靜態指標變數。例如,假設在乙個函式中包含下面的語句:
float * p_fees = new float [20];
由new
分配的80個位元組(假設float 為4個位元組)的記憶體將一直保留在記憶體中,直到使用delete
運算子將其釋放。但當包含該宣告的語句塊執行完畢時,p_fees
指標將消失。如果希望另乙個函式能夠使用這80個位元組中的內容,則必須將其位址傳遞或返回給該函式。另一方面,如果將p_fees 的鏈結性宣告為外部的,則檔案中位於該宣告後面的所有函式都可以使用它。另外,通過在另乙個檔案中使用下述宣告,便可在其中使用該指標:
extern float * p_fees;
如果要為內建的標量型別(如int
或double
)分配儲存空間並初始化,可在型別名後面加上初始值,並將其用括號括起:
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()
注意,buffer1
和buffer2
都位於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之後是四種 不同的方案來儲存資料,這些方案的區別就在於資料保留在記憶體中的時間。詳解 自動儲存持續性 在函式定義中宣告的變數 包括原函式引數 的儲存持續性為自動的。它們在程式開始執行其所屬的函式或 塊時被建立,在執行完函式或 塊時,它們使用的記憶體被釋放。靜態儲存持續性 ...