亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

C++表達式new與delete知識詳解

2020-05-23 14:04:28
字體:
來源:轉載
供稿:網友
這篇文章主要為大家詳細介紹了C++表達式new與delete知識點,學習如何動態創建對象,動態創建的對象與一般對象的區別,動態創建的對象的初始化以及釋放動態分配的內存等知識點,感興趣的朋友可以參考一下
 

在C++中,new表達式用于動態創建對象,即在堆(自由存儲區)空間上為對象分配內存,而程序員也要小心的使用這些申請來的內存空間,當不再使用時應該調用delete表達式來釋放該存儲空間并且將指針置零。 本文學習了如何動態創建對象,動態創建的對象與一般對象的區別,動態創建的對象的初始化以及釋放動態分配的內存等知識點。

C++中分配的內存大致有三類:靜態存儲區,棧內存和堆內存

其中,靜態存儲區是在程序編譯階段就已經分配好的,用于全局變量,static變量等;堆棧是比較常用的對象存儲方式。

new和delete是C++中程序員申請和撤銷堆內存的唯一方式(據我所知)。

1. 創建對象

無論是定義內置類型變量還是類類型變量,都必須指定其對應的數據類型和名字。

動態創建對象只需指定其數據類型,而不必為該對象命名。

也就是說,變量定義得到的對象可以通過額外定義的指針或其對象名本身來訪問,而動態創建方式得到的對象只能通過返回的指針來訪問,因為該對象并沒有名字。

2. 初始化

a. 可以在變量定義或是動態創建的階段初始化對象,例如:

int i(222); // definition, initializedint *pi = new int(222) // dynamically, initialized

b. 在這還要說一說變量定義時的默認初始化問題:

內置類型的變量初始化與其定義位置有關:函數外的自動初始化為零,而函數內的沒有初始化。對于類類型的變量,程序總是會調用默認構造函數來初始化,這個默認構造函數可以是系統自動生成的,也可以是程序員定義的。如果沒有默認構造函數,那么該類型變量的定義也就不能采用默認初始化方式,必須提供顯式的初始化式。

動態創建的對象默認初始化與函數內變量定義的初始化方式相同,例如:

string *ps = new string; // initialized to empty stringint *pi = new int; // pi points to an uninitialized int

c. 動態創建對象的值初始化(value-initialize)

這種值初始化不能用于變量定義,而只能用于動態創建方式。

string *ps2 = new string(); // initialized to empty stringint *pi = new int(); // pi points to an int value-initialized to 0

值初始化表明程序員想要做初始化,但并未提供特定的初值。實際上,對于提供了默認構造函數的類類型(如string),沒有必要對其對象進行值初始化:無論程序是明確地不初始化還是要求進行值初始化,都會自動調用其默認構造函數初始化該對象。值初始化真正有用的是對于內置類型。另外需要注意的一點是,值初始化的 () 語法必須置于類型名后面,而不是變量名后面,否則得到的是一個函數聲明,如下:

int myValue(); // not value-initialized int variable, but a function named myValueint *myPtr = new int(); // correct! a value-initialized int object

對于沒有默認構造函數的類類型,無論是變量定義還是動態創建對象都必須采用顯式初始化。

3. 撤銷對象

動態創建的對象用完后,程序員必須顯式地將該對象占用的內存返還給自由存儲區。C++提供了delete表達式釋放指針所指向的地址空間。

delete myPtr;
上述語句釋放 myPtr 指向的 int 型對象所占用的內存。

C++沒有明確定義如何釋放指向不是用 new 分配的內存地址的指針。此外,編譯器通常不能斷定一個指針究竟指向什么類型的對象,因此如果調用delete 企圖釋放指向棧內存地址的指針時,編譯器并不會報錯,但請盡量不要依賴于該未定義的行為。

在C++中 delete 一個零值指針是合法且安全的,但實際上毫無意義。

懸垂指針(dangling pointer)

刪除了指針所指向的對象后,該指針變成懸垂指針。懸垂指針指向曾經存放對象的內存,但該對象實際已經不存在了。懸垂指針往往導致程序錯誤,并且很難檢測。因此,在調用delete 釋放指針所指對象內存后應該立刻將指針置零。

4. Const 對象的動態分配和回收

const 對象,必須在定義階段或動態創建階段進行初始化,并且初始化之后其值不能再修改。

與其他 const 對象的地址一樣,由于 new 返回的地址上存放的是 const 對象,因此該地址只能賦給指向 const 的指針。

// allocate and initialize a const objectconst int *pci = new const int(222); // initialize to 222const int *pci2 = new const int();  // initialize to 0

盡管程序員不能改變 const 對象的值,但可撤銷對象本身。

delete pci; // ok: delete a const object
三種常見的程序錯誤都與動態內存分配相關:

1、刪除動態分配內存失敗,稱為內存泄漏(memory leak)
2、讀寫已刪除的對象
3、對同一個內存空間使用兩次 delete 表達式。當兩個指針指向同一個動態創建的對象,刪除時就會發生錯誤。第二個指針的 delete 操作往往會破壞自由存儲區。
個人實踐部分:

#include <iostream>#include <cstring>using namespace std;int main(void){  string str = "hello str";  // strNew points to dynamically allocated,  // initialized to empty string  string *strNew = new string;    cout<<"str object address: "<<&str<<endl;  cout<<"strNew pointer itself address: "<<&strNew<<endl;  cout<<"strNew pointer to address: "<<strNew<<endl;    // assignment  *strNew = "hello strNew";  cout<<"strNew pointer to address: "<<strNew<<endl;    // free memory  delete strNew;  cout<<"strNew pointer to address: "<<strNew<<endl;  strNew = NULL;    // point to other object  strNew = &str;  cout<<"strNew pointer to address: "<<strNew<<endl;      const int cvalue(10);  // iptr points to a const int object  const int *iptr = new const int(222);  cout<<"iptr value: "<<*iptr<<endl;  delete iptr;  iptr = NULL;    iptr = &cvalue;  cout<<"iptr value: "<<*iptr<<endl;    return 0;}


一次運行的結果如下:

str object address: 0x28ff24strNew pointer itself address: 0x28ff20strNew pointer to address: 0x602f70strNew pointer to address: 0x602f70strNew pointer to address: 0x602f70strNew pointer to address: 0x28ff24iptr value: 222iptr value: 10

程序中間將原來指向 new 創建的對象的指針重定向到一般的變量,可以看到指針存放地址的改變。另外需要注意,在釋放 new 對象之前不要將指針重新指向某個其他對象,這樣會導致原來動態創建的對象沒有指針指向它,無法釋放內存空間。
以上就是本文的全部內容,希望對大家的學習有所幫助。



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲人成电影在线观看天堂色| 国产一区二区三区网站| 久久精品视频在线观看| 国产精品久久综合av爱欲tv| 午夜精品视频在线| 国产精品私拍pans大尺度在线| 91成人性视频| 久久久久一本一区二区青青蜜月| www.亚洲免费视频| 欧美亚洲国产日韩2020| 136fldh精品导航福利| 亚洲精品日韩欧美| 亚洲xxxx3d| 一区二区在线视频播放| 91精品国产综合久久香蕉| 久久男人av资源网站| 91麻豆国产语对白在线观看| 78m国产成人精品视频| 国产z一区二区三区| 成人精品久久av网站| 国产精品欧美一区二区| 在线视频免费一区二区| 中文字幕日韩电影| 欧洲精品在线视频| 色琪琪综合男人的天堂aⅴ视频| 日本一区二区在线免费播放| 亚洲国产天堂网精品网站| 国产精品白丝jk喷水视频一区| 欧美精品免费在线观看| 91在线观看免费网站| 亚洲欧美国产va在线影院| 国产精品久久久久久影视| 欧美日本啪啪无遮挡网站| 亚洲一级一级97网| 91欧美日韩一区| 欧美精品第一页在线播放| 亚洲精品国产精品乱码不99按摩| 日韩精品小视频| 欧美日韩国产一区二区三区| 91产国在线观看动作片喷水| 欧美一级免费看| 亚洲成人精品在线| 中文字幕不卡在线视频极品| 欧美色道久久88综合亚洲精品| 久久久久国产一区二区三区| 久久久免费av| 欧美日韩亚洲精品一区二区三区| 日本一欧美一欧美一亚洲视频| 97久久精品人搡人人玩| 国产91成人在在线播放| 欧美一级片一区| 国产精品7m视频| 欧美精品一区二区免费| 国产精品一区二区三区在线播放| 97在线视频免费观看| 亚洲精品久久视频| 日韩av在线免费观看一区| 日韩av在线最新| 欧美成人黄色小视频| 国产在线视频欧美| 亚洲电影免费观看高清完整版| 日韩免费中文字幕| 国产精品99久久久久久久久| 91免费人成网站在线观看18| 精品少妇一区二区30p| 国产精品视频网| 亚洲国产99精品国自产| 久久精品国产v日韩v亚洲| 欧美激情奇米色| 最近2019年日本中文免费字幕| 久久99国产精品久久久久久久久| 亚洲欧美制服中文字幕| 亚洲最大成人网色| xxxxxxxxx欧美| 免费成人高清视频| 国产精品视频xxxx| 久久人人爽人人爽人人片亚洲| 日韩精品高清在线| 亚洲一区www| 国产美女扒开尿口久久久| 日韩欧美在线免费| 国产精品视频一区二区三区四| 亚洲欧美中文日韩在线| 精品一区二区电影| 欧美日韩国产中文字幕| 国色天香2019中文字幕在线观看| 欧美wwwwww| 欧美国产欧美亚洲国产日韩mv天天看完整| 欧美极品美女电影一区| 国产精品免费一区二区三区都可以| 在线不卡国产精品| 亚洲电影在线观看| 日韩有码视频在线| 91精品国产综合久久男男| 91国产视频在线播放| 精品动漫一区二区| 欧美午夜视频一区二区| 欧美肥臀大乳一区二区免费视频| 久久伊人精品一区二区三区| 2020欧美日韩在线视频| 欧美高清第一页| 一区二区欧美激情| 成人免费视频网址| 欧美在线性爱视频| 97在线看福利| 中文字幕精品一区久久久久| 亚洲精品一区av在线播放| 国产精品免费小视频| 亚洲成在人线av| 国产99久久精品一区二区永久免费| 亚洲精品福利免费在线观看| 视频直播国产精品| 国产+成+人+亚洲欧洲| 久久久久久久久久久久av| 国产精品对白刺激| 大荫蒂欧美视频另类xxxx| 懂色av中文一区二区三区天美| 日韩成人av一区| 久久国产一区二区三区| 国产精品青青在线观看爽香蕉| 国产精品一区电影| 欧美噜噜久久久xxx| 国产成人aa精品一区在线播放| 日韩av在线不卡| 亚洲欧美日韩一区二区三区在线| 国产精品18久久久久久麻辣| 国产精品一区二区三区在线播放| 日韩在线播放av| 久久人91精品久久久久久不卡| 亚洲最大成人网色| 亚洲精品不卡在线| 中国人与牲禽动交精品| 久久香蕉精品香蕉| 国产免费一区视频观看免费| 欧美大肥婆大肥bbbbb| 成人国产精品av| 日韩一区二区av| 精品久久久久久亚洲精品| 亚洲精品福利在线| 最近2019中文字幕第三页视频| 国内揄拍国内精品少妇国语| 亚洲精品av在线| 国产精品1区2区在线观看| 亚洲男人av在线| 国产精品视频永久免费播放| 国产91精品黑色丝袜高跟鞋| 亚洲精品国产免费| 欧美午夜丰满在线18影院| 午夜精品久久17c| 亚洲成色999久久网站| 国产亚洲精品高潮| 在线观看免费高清视频97| 在线视频精品一| 国产日本欧美一区二区三区在线| 91chinesevideo永久地址| 美女国内精品自产拍在线播放| 欧美日韩免费区域视频在线观看| 国产欧美日韩最新| 97**国产露脸精品国产| 久久99亚洲精品| 日日狠狠久久偷偷四色综合免费| 久久亚洲综合国产精品99麻豆精品福利| 欧美野外猛男的大粗鳮| 欧美视频在线观看免费|