最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

?C++?new?和?delete?關(guān)鍵字詳解

 更新時(shí)間:2022年06月30日 09:58:16   作者:??zidea????  
這篇文章主要介紹了?C++?new?和?delete?關(guān)鍵字詳解,文章圍繞主題展開(kāi)new?和?delete?的使用方法的介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下

前言

最早接觸到new這個(gè)關(guān)鍵字,是在 Java 中,然后 ES6 之后的 js 中也提供了 new 這個(gè)關(guān)鍵字,在 java 和 js 這兩門語(yǔ)言中,使用 new 關(guān)鍵詞可以實(shí)例化類的對(duì)象。語(yǔ)義是相似的,但是其背后還是有些差異的,js 的 new 和 class 可能是一些語(yǔ)法糖。

那么有了這些對(duì) new 這個(gè)關(guān)鍵字用法的了解,我們今天來(lái)看一看 c++ 中提供 new 這個(gè)關(guān)鍵字的用途和用法。

我們都知道 c++ 一門效率和性能為先的語(yǔ)言,選擇 c++ 來(lái)開(kāi)發(fā)應(yīng)用多數(shù)考慮性能才選擇這門語(yǔ)言來(lái)開(kāi)發(fā)應(yīng)用程序。 C++允許我們?cè)谶\(yùn)行時(shí)為一個(gè)變量或一個(gè)數(shù)組分配內(nèi)存。這就是的動(dòng)態(tài)內(nèi)存分配。在 java 和 js 這樣語(yǔ)言中,編譯器都是內(nèi)存分配和回收機(jī)制,開(kāi)發(fā)人員不用為內(nèi)存管理而花費(fèi)時(shí)間和精力。但是在 c++ 這門語(yǔ)言這大不一樣,一切都是程序員自己思考,如何分配內(nèi)存以及在適當(dāng)時(shí)機(jī)將其回收。

那么今天要聊的newdelete操作符就是用來(lái)動(dòng)態(tài)地分配和回收內(nèi)存。

new 和 delete 的使用

new

int* ptr;
ptr = new int;
*ptr = 2;
cout << *ptr << endl;

這里new動(dòng)態(tài)地獲取一塊大小為 int 類型大小的內(nèi)存,然后將指向這塊內(nèi)存地址指針?lè)祷亟optr這個(gè)我們之前定義好的用于存放int類型大小的指針。

delete

隨后我們用delete來(lái)釋放指針ptr指向的內(nèi)存。

delete ptr;

接下來(lái)我們通過(guò) 3 個(gè)小例子,分別介紹如何使用 new 和 delete 為基本類型、組數(shù)和對(duì)象來(lái)動(dòng)態(tài)分配內(nèi)存以及回收內(nèi)存

float* pointFloat;
pointFloat = new float;
*pointFloat = 2.0f;
cout << *pointFloat << endl;

為數(shù)組分配內(nèi)存和釋放內(nèi)存

int main()
{
    int num= 5;
    int* intPointer;
    intPointer = new int[num];
    for (int i = 0; i < num; ++i) {
        cout << "level of tut: " << i + 1 << ": ";
        cin >> *(intPointer + i);
    }
    for (int i = 0; i < num; ++i) {
        cout << "level of tut" << i + 1 << ": " << *(intPointer + i) << endl;
      }
    delete[] intPointer;
    cout<<"Hello World";
    return 0;
}

使用new為 float 數(shù)組動(dòng)態(tài)地分配了內(nèi)存,返回指針是指向內(nèi)存第一個(gè)元素的地址。

class Tut
{
private:
    int level_;
public:
    Tut(int level):level_(level){}
    
    void printLevel(){
        cout << "level: " << level_ << endl;
    }
};
int main()
{
    Tut* ptr = new Tut(2);
    ptr->printLevel();
    delete ptr;
    cout<<"Hello World";
    return 0;
}

注意箭頭運(yùn)算符->,當(dāng)通過(guò)指針訪問(wèn)類成員函數(shù)時(shí)候會(huì)用到->。

那么new主要做了什么事情,尋找合適大小內(nèi)存,然后將指向內(nèi)存地址的指針?lè)祷亟o你,注意這時(shí)new不僅負(fù)責(zé)分配了Tut大小的內(nèi)存,同時(shí)還調(diào)用了Tut的構(gòu)造函數(shù)。

void* operator new(size_t size)
void operator delete(void*);

malloc 和 new

有時(shí)候我們通常可以用malloc來(lái)分配內(nèi)存,不過(guò)使用malloc與使用new有一定區(qū)別

class Base
{
    int val_;
public:
    Base() = default;
    Base(int val):val_(val){}
    
    void print(){
        cout << val_ << endl;
    }
};

可以使用 malloc分配sizeof(Base)Base 類大小內(nèi)存空間,那么new操作符和malloc其實(shí)通常都做了找到一塊可以存放 Base 類型數(shù)據(jù)大小內(nèi)存,然后將內(nèi)存地址返回,不同之處,new除了作為分配內(nèi)存的工作之外,還調(diào)用了一下夠著函數(shù)。

Base* base = new Base();
Base* base = (Base*)malloc(sizeof(Base));
Base* base = new Base(1);
base->print();

delete 和 delete[]

使用關(guān)鍵字 new 在堆上開(kāi)辟一塊內(nèi)存用于存放 Base 類型大小的數(shù)據(jù),因?yàn)?c++ 沒(méi)有像 Java 那樣的垃圾回收機(jī)制,所以需要手動(dòng)將這塊內(nèi)存釋放。

delete base;

這里值得提一下,就是deletedelete[]是 2 個(gè)不同的操作符,所以我們釋放數(shù)組時(shí)候需要選擇delete[]而不是delete。

int* arr_ptr = new int[20];
delete[] arr_ptr;

到此這篇關(guān)于 C++ new 和 delete 關(guān)鍵字詳解的文章就介紹到這了,更多相關(guān) C++ new 和 delete 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++之類和對(duì)象課后習(xí)題簡(jiǎn)單實(shí)例

    C++之類和對(duì)象課后習(xí)題簡(jiǎn)單實(shí)例

    下面小編就為大家?guī)?lái)一篇C++之類和對(duì)象課后習(xí)題簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • C語(yǔ)言指針原來(lái)也可以這樣了解

    C語(yǔ)言指針原來(lái)也可以這樣了解

    這篇文章非常詳細(xì)的講解了C語(yǔ)言中指針的概念,包含多種方法,多種定義,全面的說(shuō)明了C語(yǔ)言的特性,希望能給你帶來(lái)幫助
    2021-08-08
  • C語(yǔ)言中十六進(jìn)制轉(zhuǎn)十進(jìn)制兩種實(shí)現(xiàn)方法

    C語(yǔ)言中十六進(jìn)制轉(zhuǎn)十進(jìn)制兩種實(shí)現(xiàn)方法

    這篇文章主要介紹了C語(yǔ)言中十六進(jìn)制轉(zhuǎn)十進(jìn)制兩種實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • C語(yǔ)言函數(shù)指針的老生常談

    C語(yǔ)言函數(shù)指針的老生常談

    這篇文章主要為大家介紹了vue組件通信的幾種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-11-11
  • C語(yǔ)言應(yīng)用領(lǐng)域分析

    C語(yǔ)言應(yīng)用領(lǐng)域分析

    在本篇文章里小編給各位分享的是關(guān)于C語(yǔ)言應(yīng)用領(lǐng)域分析內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2020-03-03
  • 基于Matlab實(shí)現(xiàn)中國(guó)象棋的示例代碼

    基于Matlab實(shí)現(xiàn)中國(guó)象棋的示例代碼

    中國(guó)象棋是起源于中國(guó)的一種棋,屬于二人對(duì)抗性游戲的一種,在中國(guó)有著悠久的歷史。由于用具簡(jiǎn)單,趣味性強(qiáng),成為流行極為廣泛的棋藝活動(dòng)。本文將利用Matlab實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-02-02
  • C++初階教程之類和對(duì)象

    C++初階教程之類和對(duì)象

    C++是面向?qū)ο缶幊痰?這也是C++與C語(yǔ)言的最大區(qū)別,而類和對(duì)象就是C++面向?qū)ο蟮幕A(chǔ),下面這篇文章主要給大家介紹了關(guān)于C++初階教程之類和對(duì)象的相關(guān)資料,需要的朋友可以參考下
    2022-02-02
  • c++ minicsv庫(kù)的編譯錯(cuò)誤與解決方案

    c++ minicsv庫(kù)的編譯錯(cuò)誤與解決方案

    有一個(gè)項(xiàng)目需要寫(xiě)csv文件以呈現(xiàn)數(shù)據(jù)。Github上有一個(gè)關(guān)于csv的輕量級(jí)讀寫(xiě)庫(kù)minicsv,于是下載之。但是編譯example時(shí)出現(xiàn)了以下問(wèn)題
    2016-11-11
  • 利用C++如何覆蓋或刪除指定位置的文件內(nèi)容

    利用C++如何覆蓋或刪除指定位置的文件內(nèi)容

    這篇文章主要給大家介紹了關(guān)于利用C++如何覆蓋或刪除指定位置的文件內(nèi)容,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • 詳解C++編程中的虛函數(shù)

    詳解C++編程中的虛函數(shù)

    這篇文章主要介紹了詳解C++編程中的虛函數(shù),包括在什么情況下應(yīng)當(dāng)聲明虛函數(shù)的相關(guān)講解,需要的朋友可以參考下
    2015-09-09

最新評(píng)論

定陶县| 沐川县| 龙州县| 乐山市| 平潭县| 文安县| 宁化县| 新营市| 西乌珠穆沁旗| 宁波市| 黔南| 乌兰察布市| 武川县| 韶关市| 吉隆县| 余江县| 招远市| 鹰潭市| 沂南县| 德钦县| 垫江县| 靖边县| 怀集县| 龙陵县| 广宁县| 杭锦后旗| 萨迦县| 苍溪县| 罗江县| 新干县| 隆尧县| 新竹市| 浦北县| 永福县| 正宁县| 济宁市| 常德市| 余江县| 荣昌县| 藁城市| 阜宁县|