日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式

發(fā)布時(shí)間:2025/4/16 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1. 有些時(shí)候在運(yùn)行時(shí)創(chuàng)建數(shù)組由于在編譯時(shí)創(chuàng)建數(shù)組(有些時(shí)候不是這樣, 比如使用OpenGL繪圖和GPU并行計(jì)算結(jié)合的時(shí)候, 需要將大量的數(shù)據(jù)傳送到顯存, 每次計(jì)算完又要傳送回宿主機(jī)渲染, 但并不是要傳送回所以值, 有些值可以仍然留在顯存中, 對(duì)于這些值, 顯然一次創(chuàng)建最恰當(dāng), 使用靜態(tài)數(shù)組最合適, 當(dāng)然使用動(dòng)態(tài)數(shù)組也可以, 但是只需創(chuàng)建一次就可以了), 對(duì)于結(jié)構(gòu)體也是這樣.

2. C++中的結(jié)構(gòu)體. 有兩種方式, 一種是動(dòng)態(tài)方式, 一種是靜態(tài)方式. 使用new一般是動(dòng)態(tài)方式, 一般是與指針搭配, 靜態(tài)方式是直接聲明的.
??? struct price{
???????? int apple;
???????? int orange;
???? };
???? 靜態(tài)方式, 是結(jié)構(gòu)體類(lèi)型數(shù)據(jù), 類(lèi)似于int類(lèi)型數(shù)據(jù)的聲明方式, 如price p1={100,200};或者price p1; p1.apple=100; p1.orange=200; 靜態(tài)方式是結(jié)構(gòu)體類(lèi)型數(shù)據(jù), 訪問(wèn)結(jié)構(gòu)體成員的時(shí)候采用句點(diǎn)操作符, 例如p1.apple, p1.orange.
???? 動(dòng)態(tài)方式, 結(jié)構(gòu)體指針類(lèi)型數(shù)據(jù), 采用箭頭操作符訪問(wèn)結(jié)構(gòu)體成員, 如price * p2=new price; p2->apple=100; p2->orange=200; 當(dāng)然也可以通過(guò)這樣的方式采用句點(diǎn)操作符訪問(wèn)結(jié)構(gòu)體成員. 例如對(duì)于結(jié)構(gòu)體指針price *p3=new price;(這里創(chuàng)建了一個(gè)結(jié)構(gòu)體, 將結(jié)構(gòu)體的首地址返回給等號(hào)右邊, 并賦給指向此結(jié)構(gòu)體的指針p3, 不能直接寫(xiě)成price *p3, 這樣只是創(chuàng)建了一個(gè)指針, 并沒(méi)有創(chuàng)建結(jié)構(gòu)體), p3是指向結(jié)構(gòu)體的指針, 那么使用解除引言操作符*可以得到結(jié)構(gòu)體本身, 即*p3是結(jié)構(gòu)體本身, 那么訪問(wèn)成員的方式可以這樣(*p3).apple, (*p3).orange.

3. 使用new動(dòng)態(tài)分配內(nèi)存, 并釋放內(nèi)存一遍重新使用. 下面的代碼使用了返回指針的函數(shù).
#include <iostream> #include <cstring> using namespace std;char * getname() //返回指向輸入字符串的指針 {//子函數(shù)里面分配的內(nèi)存temp是在棧里面,子函數(shù)結(jié)束調(diào)用后會(huì)自動(dòng)釋放, 如果不讓他釋放,就要在子函數(shù)里使用malloc或者new, 子函數(shù)里分配的內(nèi)存在子函數(shù)結(jié)束調(diào)用后才不會(huì)自動(dòng)釋放掉,但是如果main函數(shù)結(jié)束后,所以得內(nèi)存都會(huì)被釋放.char temp[80];//假設(shè)最多輸入80個(gè)cout<<"Enter name: ";cin>>temp;char *pn=new char[strlen(temp)+1];//分配合適的內(nèi)存數(shù),子函數(shù)調(diào)用后不會(huì)自動(dòng)釋放strncpy(pn,temp,80);//拷貝temp指向的數(shù)據(jù)給pn指向的內(nèi)存空間return pn; //返回指向包含輸入字符串的指針 }int main() {char *name;name=getname();//name指向輸入字符串//從name開(kāi)始打印字符,知道遇到空字符為止,并輸出字符串的首地址cout<<name<<" at "<<(int *)name<<endl;delete [] name; //釋放子函數(shù)getname里面分配的內(nèi)存name=getname();//再次調(diào)用子函數(shù)cout<<name<<" at" <<(int *)name<<endl;delete [] name;return 0; }

4. 三種存儲(chǔ)方式: 自動(dòng)存儲(chǔ), 靜態(tài)存儲(chǔ), 動(dòng)態(tài)存儲(chǔ).
?? 自動(dòng)存儲(chǔ):?函數(shù)內(nèi)部定義的常規(guī)變量使用自動(dòng)存儲(chǔ)空間, 稱為自動(dòng)變量(也稱局部變量), 如getname函數(shù)中的temp, pn. 他們?cè)谒鶎俚暮瘮?shù)被調(diào)用時(shí)自動(dòng)產(chǎn)生, 在該函數(shù)結(jié)束時(shí)消亡, 例如getname函數(shù)中的temp只在getname函數(shù)被調(diào)用時(shí)存在,?當(dāng)調(diào)用結(jié)束時(shí), temp使用的內(nèi)存將被自動(dòng)釋放, 如果getname返回temp的地址, 則main函數(shù)name指向的內(nèi)存將很快被重新使用, 因此我們必須在getname中使用new并獲取一個(gè)副本.
?? 靜態(tài)存儲(chǔ): 靜態(tài)存儲(chǔ)是在整個(gè)程序執(zhí)行期間都存在的存儲(chǔ)方式, 在函數(shù)外聲明它或者使用關(guān)鍵字static.
?? 動(dòng)態(tài)存儲(chǔ): new和delete提供了比自動(dòng)變量和靜態(tài)變量更靈活的方法. 他們管理一個(gè)內(nèi)存池, 也成為自由存儲(chǔ)空間. 內(nèi)存池通用語(yǔ)靜態(tài)變量和自動(dòng)變量的內(nèi)存是分開(kāi)的. new和delete是程序員對(duì)程序如何使用內(nèi)存有更大的控制權(quán).

5. 堆棧, 堆和內(nèi)存泄漏. 如果使用了new, 沒(méi)有調(diào)用delete, 即使包含指針的內(nèi)存由于作用域規(guī)則和對(duì)象生命周期的原因而被釋放, 但是在自由存儲(chǔ)空間上動(dòng)態(tài)分配的變量或者結(jié)構(gòu)也將繼續(xù)存在, 但是將會(huì)無(wú)法訪問(wèn)這些內(nèi)存, 因?yàn)橹赶蜻@些內(nèi)存的指針無(wú)效了.這將導(dǎo)致內(nèi)存泄漏. 被泄漏的內(nèi)存將在程序的整個(gè)生命周期內(nèi)斗不可使用, 這些內(nèi)存被分配出去, 但無(wú)法收回, 可能導(dǎo)致可用內(nèi)存耗盡, 程序崩潰. 我們要養(yǎng)成一種好習(xí)慣, 成對(duì)的使用new和delete, 在自由存儲(chǔ)空間上動(dòng)態(tài)分配內(nèi)存, 隨后便釋放它.

總結(jié)

以上是生活随笔為你收集整理的1.5 使用new创建动态结构和自动, 静态, 动态三种存储方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。