日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

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

作者:??zidea???? ? 更新時(shí)間: 2022-08-22 編程語言

前言

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

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

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

那么今天要聊的newdelete操作符就是用來動(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)存地址指針返回給ptr這個(gè)我們之前定義好的用于存放int類型大小的指針。

delete

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

delete ptr;

接下來我們通過 3 個(gè)小例子,分別介紹如何使用 new 和 delete 為基本類型、組數(shù)和對象來動(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)通過指針訪問類成員函數(shù)時(shí)候會(huì)用到->

那么new主要做了什么事情,尋找合適大小內(nèi)存,然后將指向內(nèi)存地址的指針返回給你,注意這時(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來分配內(nèi)存,不過使用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 在堆上開辟一塊內(nèi)存用于存放 Base 類型大小的數(shù)據(jù),因?yàn)?c++ 沒有像 Java 那樣的垃圾回收機(jī)制,所以需要手動(dòng)將這塊內(nèi)存釋放。

delete base;

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

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

原文鏈接:https://juejin.cn/post/7114558008411045919

欄目分類
最近更新