欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++ new/delete相關(guān)知識點詳細(xì)解析

 更新時間:2013年09月09日 10:55:54   作者:  
C語言用一堆標(biāo)準(zhǔn)庫函數(shù)malloc和free在自由存儲區(qū)中分配存儲空間,而C++則用new和delete表達(dá)式實現(xiàn)相同的功能

每個程序在執(zhí)行時都占用一塊可用的內(nèi)存空間,用于存放動態(tài)分配的對象,此內(nèi)存空間稱為程序的自由存儲區(qū)(free store)或堆(heap)。C語言用一堆標(biāo)準(zhǔn)庫函數(shù)malloc和free在自由存儲區(qū)中分配存儲空間,而C++則用new和delete表達(dá)式實現(xiàn)相同的功能。

一、new和delete創(chuàng)建和釋放動態(tài)數(shù)組:
數(shù)組類型的變量有三個重要的限制:數(shù)組長度固定,在編譯時必須知道其長度,數(shù)組只在定義它的語句內(nèi)存在。動態(tài)數(shù)組:長度固定,編譯時不必知道其長度,通常是運行時確定;一直存在,直到程序顯示釋放它。

1、動態(tài)數(shù)組的定義:數(shù)組變量通過指定類型、數(shù)據(jù)名和維數(shù)來定義。而動態(tài)分配數(shù)組時,只需指定類型和數(shù)組長度,不必為數(shù)組對象命名,new表達(dá)式返回指向新分配數(shù)組的第一個元素的指針:int*pia=new int[10];在自由存儲區(qū)中創(chuàng)建的數(shù)組對象沒有名字,只能通過其地址間接訪問堆中的對象。

2、初始化動態(tài)分配的數(shù)組:若數(shù)組元素具有類類型,將使用該類的默認(rèn)構(gòu)造函數(shù)初始化;若數(shù)組元素是內(nèi)置類型,則無初始化。也可跟在數(shù)組長度后面的一堆空圓括號,對數(shù)組元素做值初始化。

string *psa=newstring[10];  //array of 10 empty strings
int *pia=newint[10];  //array of 10 uninitializedints
int *pia2=newint[10]();  //array of 10 zero

對于動態(tài)分配的數(shù)組,其元素只能初始化為元素類型的默認(rèn)值,而不能像數(shù)組變量一樣,用初始化列表為數(shù)組元素提供各不相同的初值。

3、const對象的動態(tài)數(shù)組:若在堆中創(chuàng)建的數(shù)組存儲了內(nèi)置類型的const對象,則必須為這個數(shù)組提供初始化:因數(shù)組元素都是const對象,無法復(fù)制。

const int*pci_ok=new const int[100]();

C++允許定義類類型的const數(shù)組,但該類型必須提供默認(rèn)構(gòu)造函數(shù)。

已創(chuàng)建的常量元素不允許修改,所以此類數(shù)組用處不大。

4、允許動態(tài)分配空數(shù)組:動態(tài)分配數(shù)組,多是由于編譯時不知道數(shù)組長度。
size_t  n=get_size();    int*p=new int[n];

C++雖然不允許定義長度為0的數(shù)組變量,但明確指出,調(diào)用new創(chuàng)建長度為0的數(shù)組是合法的。new返回有效的非零指針。該指針不能與new返回的其他指針不同,不能進(jìn)行解引用操作,因它沒指向任何元素。允許的操作:比較運算。

5、動態(tài)空間的釋放:程序員必須顯示將其占用的存儲空間返還給程序的自由存儲區(qū)。C++語言為指針提供delete []表達(dá)式釋放指針?biāo)赶虻臄?shù)組空間。

delete [] pia;[]告訴編譯器該指針指向的是堆中的數(shù)組,而非單個對象,若遺漏,編譯器無法發(fā)現(xiàn)。

二、new和delete創(chuàng)建和釋放單個對象
定義變量時,必須指定其數(shù)據(jù)類型和名字。而動態(tài)創(chuàng)建對象時,只需指定其數(shù)據(jù)類型。new返回指向新創(chuàng)建對象的指針,通過該指針來訪問此對象。

1、動態(tài)創(chuàng)建對象的初始化:int *pi=new int(1024)

2、動態(tài)創(chuàng)建對象的默認(rèn)初始化:若不提供顯式初始化,與函數(shù)內(nèi)定義的變量初始化方式相同,類類型->默認(rèn)構(gòu)造函數(shù);內(nèi)置類型->無初始化。同樣可做值初始化:

int *pi=newint();值初始化的()必須置于類型名后,而非變量后,int x()是聲明函數(shù)。

3、撤銷動態(tài)創(chuàng)建的對象:程序員必須顯示將該對象占用的內(nèi)存返回給自由存儲區(qū)。delete,若指針指向不是用new分配的內(nèi)存地址,則對該指針使用delete非法。

int i;  int *pi=&i;  delete pi;//編譯器不能斷定一個指針指向什么類型的對象,因此大部分編譯器仍能通過(VS2005編譯通過,執(zhí)行到該處報錯)。

4、零指針的刪除:int *ip=0; delete ip;若指針值為0,則delete合法。

5、delete后,重設(shè)指針值:delete p;刪除指針后,p成為懸垂指針。懸垂指針指向曾經(jīng)存放對象的內(nèi)存,但該對象已不存在,引用該內(nèi)存報錯。所以一旦刪除指針?biāo)赶虻膶ο?,立即將指針置?。

6、const對象的動態(tài)分配和回收:創(chuàng)建時初始化,且一經(jīng)初始化,其值不可修改。

const int*pci=new const int(1024);new表達(dá)式返回int型const對象的指針。所以只能賦給指向const的指針。內(nèi)置類型對象或未提供默認(rèn)構(gòu)造函數(shù)的類類型對象必須顯示初始化。

刪除const對象:delete pci;

三、與動態(tài)內(nèi)存分配相關(guān)的三種常見程序錯誤:
1、刪除指向動態(tài)分配內(nèi)存的指針失敗,稱為memory leak。一般需等程序運行一段時間,耗盡內(nèi)存時,才顯露出來。

2、讀寫已刪除的對象。若刪除指針?biāo)笇ο蠛螅弥羔樦禐?,易檢查出此類錯誤。

3、對同一個內(nèi)存空間使用兩次delete表達(dá)式。第二次delete時,自由存儲區(qū)可能被破壞。

相關(guān)文章

  • C++ cmake實現(xiàn)日志類的示例代碼

    C++ cmake實現(xiàn)日志類的示例代碼

    CMake是一個跨平臺的安裝(編譯)工具,可以用簡單的語句來描述所有平臺的安裝(編譯過程)。本文就來利用cmake實現(xiàn)日志類,感興趣的小伙伴可以了解一下
    2023-03-03
  • 推薦幾款實用的C++ 在線工具

    推薦幾款實用的C++ 在線工具

    這篇文章主要推薦了幾款實用的C++ 在線工具,幫助大家更好的進(jìn)行c++開發(fā),感興趣的朋友可以了解下載。
    2020-10-10
  • C++實現(xiàn)LeetCode(112.二叉樹的路徑和)

    C++實現(xiàn)LeetCode(112.二叉樹的路徑和)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(112.二叉樹的路徑和),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++直接初始化與復(fù)制初始化的區(qū)別深入解析

    C++直接初始化與復(fù)制初始化的區(qū)別深入解析

    這篇文章主要介紹了C++直接初始化與復(fù)制初始化的區(qū)別深入解析,是很多C++初學(xué)者需要深入了解的重要概念,需要的朋友可以參考下
    2014-09-09
  • C/C++實現(xiàn)馬踏棋盤算法

    C/C++實現(xiàn)馬踏棋盤算法

    這篇文章主要為大家詳細(xì)介紹了C/C++實現(xiàn)馬踏棋盤算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • C語言由淺入深理解指針

    C語言由淺入深理解指針

    C語言這門課程在計算機的基礎(chǔ)教學(xué)中一直占有比較重要的地位,然而要想突破C語言的學(xué)習(xí),對指針的掌握是非常重要的,本文將具體針對指針的基礎(chǔ)做詳盡的介紹
    2022-05-05
  • C++類與對象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解

    C++類與對象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解

    這篇文章主要為大家介紹了C++類與對象及構(gòu)造函數(shù)析構(gòu)函數(shù)基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)鏈表逆序并輸出

    C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)鏈表逆序并輸出

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)實現(xiàn)鏈表逆序并輸出的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • VC++中HTControl的CHTButton按鈕控件類用法實例解析

    VC++中HTControl的CHTButton按鈕控件類用法實例解析

    這篇文章主要介紹了VC++中HTControl的CHTButton按鈕控件類用法,對于大家進(jìn)行VC++項目開發(fā)有一定的幫助作用,需要的朋友可以參考下
    2014-08-08
  • C語言實現(xiàn)反彈球游戲

    C語言實現(xiàn)反彈球游戲

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)反彈球游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論