C++存儲方案和動態分配

存儲方案和動態分配

在之前的文章當中,我們討論瞭C++用來為變量分配內存的5種方案,但是這些方案並不適用於使用new運算符分配的內存,這種內存被稱為動態內存。

我們在之前的文章當中也曾介紹過,動態內存由newdelete控制,而不是由作用域和鏈接性規則控制。所以我們可以在一個函數當中分配動態內存,在另外一個函數中釋放。

通常C++編譯器當中有三塊獨立的內存,一塊用於靜態變量,一塊用於自動變量,還有一塊用於動態存儲。

雖然存儲方案的概念不適用於動態內存,但是適用於動態內存的自動和靜態指針。C++ Primer當中有這麼一個例子,我們在一個函數當中有如下語句:

float * p_fees = new float[20];


很明顯,我們通過new創建瞭一個長度為20的float數組,這塊數組的內存將會一直停留在內存當中,直到使用delete語句釋放。但當該函數運行結束的時候,p_fees這個指針將會消失。如果希望在其他地方能夠使用這個數組,需要將地址通過某種方式返回或者傳遞。

如果我們將p_fees的鏈接性聲明為外部的,那麼我們在其他地方都可以訪問到瞭,如果另外的文件當中需要訪問,也同樣可以使用關鍵字extern

初始化

前面講瞭使用new申請內存的方法,如果我們想要在分配內存的同時完成變量的初始化,應該怎麼辦呢?

如果要為內置的標量類型分配空間並初始化,可以在類型名後面加上初始值,並將它用括號括起來:

int *pi = new int(3);
double *pd = new double(99.9);


如果我們要初始化結構體或者是數組,則需要使用大括號的列表初始化,這需要編譯器支持C++11,這是C++11中的新特性:

struct P {
    int x, y;
};

P *p = new P{3, 4};
int *arr = new int[4] {2, 3, 4, 5};


在C++11當中也支持對單值變量使用列表初始化:

double *pd = new double(99.99);

到此這篇關於C++存儲方案和動態分配的文章就介紹到這瞭,更多相關C++存儲方案和動態分配內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: