C ++ 動(dòng)態(tài)內(nèi)存分配(淺)

我學(xué)C++數(shù)組的起初,想到能不能在“編譯時(shí)數(shù)組元素是可以變化,運(yùn)行時(shí)才確定元素個(gè)數(shù)”的這一問(wèn)題。于是我開(kāi)始看書,上別人的博客學(xué)習(xí),找到了動(dòng)態(tài)分配內(nèi)存的方法,憑著自己的理解,我嘗試寫下自己的想法。本人初學(xué),希望能多多體諒。

1、“?!焙汀岸选?/p>

當(dāng)時(shí)看到棧和堆時(shí)是一臉懵逼,上網(wǎng)查了查才大致了解這兩個(gè)是什么意思。

棧(stack):是由計(jì)算機(jī)自動(dòng)給你分配釋放內(nèi)存空間,就像是一個(gè)保姆所有的活都是他給來(lái)完成。在棧里存放著函數(shù)的參數(shù)值,局部變量的值等。棧是一級(jí)緩存(一級(jí)緩存:
一級(jí)緩存
都內(nèi)置在CPU內(nèi)部并與CPU同速運(yùn)行,可以有效的提高CPU的運(yùn)行效率。一級(jí)緩存越大,CPU的運(yùn)行效率越高,但受到CPU內(nèi)部結(jié)構(gòu)的限制,一級(jí)緩存的容量都很?。诒徽{(diào)用時(shí)在儲(chǔ)存空間,用完后就立即釋放。

堆(heap):是由程序員進(jìn)行手動(dòng)分配釋放空間,什么活都得自己干。堆是二級(jí)緩存生命周期由虛擬機(jī)的垃圾回收
算法來(lái)決定。程序員必須手動(dòng)分配內(nèi)存,手動(dòng)釋放內(nèi)存。

棧的存儲(chǔ)容量小,堆是可以隨意操作。

2、運(yùn)算符new和delete

(1)new

*類型標(biāo)識(shí)符 * 智指針名 = new 類型標(biāo)識(shí)符(初始值);
**
數(shù)組申請(qǐng)內(nèi)存空間語(yǔ)句如:int
a=new int[6];

這里是向系統(tǒng)申請(qǐng)6個(gè)整形int元素空間,并把空間開(kāi)始的地址賦給a,這樣a就指向一塊具有6個(gè)儲(chǔ)存整型元素的內(nèi)存空間了。

動(dòng)態(tài)內(nèi)存分配空間是在運(yùn)行時(shí)確定,所以用new在堆上定義時(shí),它的長(zhǎng)度是一個(gè)變量。
new數(shù)組也是有缺點(diǎn)的的:不能提供顯示初始化值。


(2)delete
delete 指針名;
對(duì)于數(shù)組:delete []指針名;
示例:
int* arr1=new int;
delete arr1;
int* arr2 =new int[11];
delete []arr2;
注:在為一個(gè)數(shù)組釋放空間時(shí),是不需要寫數(shù)組長(zhǎng)度。

示例代碼:

include "iostream"

using namespace std;

int main()
{
int * pcount = new int;//動(dòng)態(tài)創(chuàng)建一個(gè)變量
cout << "請(qǐng)輸入數(shù)組長(zhǎng)度:" << endl;
cin >> pcount;
cout << "請(qǐng)輸入數(shù)組元素:" << endl;
int
pArray = new int[*pcount];//動(dòng)態(tài)創(chuàng)建一個(gè)數(shù)組
for (int i{ 0 }; i < *pcount; i += 1)
{
cin >> pArray[i];
}
cout << "數(shù)組元素為:" << endl;
for (int i{ 0 }; i < *pcount; i += 1)
{
cout << pArray[i] << endl;
}
delete pcount;
delete []pArray;
return 0;
}

運(yùn)行結(jié)果:

運(yùn)行結(jié)果

注意:對(duì)于不是用new分配內(nèi)存的,使用delete是不合法的。并且只能對(duì)new分配的空間只能使用一次delete

如:
int i;
int*pi=&i;
string str ="bcdrf";

 delete str; //錯(cuò),str不是一個(gè)動(dòng)態(tài)創(chuàng)建對(duì)象
 delete pi; //錯(cuò),pi指向一個(gè)實(shí)例變量

首先編譯器是能先看出str不是指針類型,這個(gè)編譯器是能檢查出來(lái)的。其次,第二個(gè)錯(cuò)誤編譯器是不能檢查出來(lái)的,他不能確定一個(gè)指針能指向一個(gè)什么樣的對(duì)象。
因此,我們總結(jié)出,new和delete必須同時(shí)出現(xiàn),并且出現(xiàn)的次數(shù)必須一樣。

這些是我在學(xué)習(xí)動(dòng)態(tài)內(nèi)存分配時(shí)所記下的一些筆記,內(nèi)容不深,非常適合剛剛接觸c++內(nèi)存動(dòng)態(tài)分配的同學(xué)去看看,有什么不足的,希望大家諒解,我也是一名小學(xué)生,我會(huì)在日后多多深入學(xué)習(xí)c++寫出好的文章,望大家支持?。?!
本人不盛感激!??!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 題目?jī)?nèi)容: class Fruit{int no;double weight;char key;public:vo...
    故事狗閱讀 1,074評(píng)論 0 1
  • C++運(yùn)算符重載-下篇 本章內(nèi)容:1. 運(yùn)算符重載的概述2. 重載算術(shù)運(yùn)算符3. 重載按位運(yùn)算符和二元邏輯運(yùn)算符4...
    Haley_2013閱讀 1,529評(píng)論 0 49
  • 基本概念 1a general-purpose programming language用于創(chuàng)建計(jì)算機(jī)程序。藝術(shù)類...
    伍帆閱讀 1,508評(píng)論 0 1
  • C語(yǔ)言中內(nèi)存分配 在任何程序設(shè)計(jì)環(huán)境及語(yǔ)言中,內(nèi)存管理都十分重要。在目前的計(jì)算機(jī)系統(tǒng)或嵌入式系統(tǒng)中,內(nèi)存資源仍然是...
    一生信仰閱讀 1,310評(píng)論 0 2
  • (JG-2014-08-20)(前半部分經(jīng)過(guò)網(wǎng)上多篇文章對(duì)比整理)(后半部分根據(jù)ExceptionalCpp、C+...
    JasonGao閱讀 5,735評(píng)論 2 23

友情鏈接更多精彩內(nèi)容