C++存儲方案和動態(tài)分配
存儲方案和動態(tài)分配
在之前的文章當中,我們討論了C++用來為變量分配內(nèi)存的5種方案,但是這些方案并不適用于使用new運算符分配的內(nèi)存,這種內(nèi)存被稱為動態(tài)內(nèi)存。
我們在之前的文章當中也曾介紹過,動態(tài)內(nèi)存由new和delete控制,而不是由作用域和鏈接性規(guī)則控制。所以我們可以在一個函數(shù)當中分配動態(tài)內(nèi)存,在另外一個函數(shù)中釋放。
通常C++編譯器當中有三塊獨立的內(nèi)存,一塊用于靜態(tài)變量,一塊用于自動變量,還有一塊用于動態(tài)存儲。
雖然存儲方案的概念不適用于動態(tài)內(nèi)存,但是適用于動態(tài)內(nèi)存的自動和靜態(tài)指針。C++ Primer當中有這么一個例子,我們在一個函數(shù)當中有如下語句:
float * p_fees = new float[20];
很明顯,我們通過new創(chuàng)建了一個長度為20的float數(shù)組,這塊數(shù)組的內(nèi)存將會一直停留在內(nèi)存當中,直到使用delete語句釋放。但當該函數(shù)運行結(jié)束的時候,p_fees這個指針將會消失。如果希望在其他地方能夠使用這個數(shù)組,需要將地址通過某種方式返回或者傳遞。
如果我們將p_fees的鏈接性聲明為外部的,那么我們在其他地方都可以訪問到了,如果另外的文件當中需要訪問,也同樣可以使用關(guān)鍵字extern。
初始化
前面講了使用new申請內(nèi)存的方法,如果我們想要在分配內(nèi)存的同時完成變量的初始化,應該怎么辦呢?
如果要為內(nèi)置的標量類型分配空間并初始化,可以在類型名后面加上初始值,并將它用括號括起來:
int *pi = new int(3); double *pd = new double(99.9);
如果我們要初始化結(jié)構(gòu)體或者是數(shù)組,則需要使用大括號的列表初始化,這需要編譯器支持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);
到此這篇關(guān)于C++存儲方案和動態(tài)分配的文章就介紹到這了,更多相關(guān)C++存儲方案和動態(tài)分配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言fgetc和fputc函數(shù)用法詳解(以字符形式讀寫文件)
這篇文章主要介紹了C語言fgetc和fputc函數(shù)用法詳解(以字符形式讀寫文件),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-01-01
C語言?模擬實現(xiàn)memcpy與memmove函數(shù)詳解
這篇文章主要介紹了C語言詳解如何模擬內(nèi)存函數(shù),用到了mencpy與memmove兩個函數(shù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步2022-04-04
C語言中g(shù)etchar(?)?函數(shù)使用詳解
getchar()?字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個字,需要注意一次只能讀取一個字符,這篇文章主要介紹了C語言中g(shù)etchar函數(shù)使用詳解,需要的朋友可以參考下2022-12-12

