?C++?new?和?delete?關(guān)鍵字詳解
前言
最早接觸到new這個(gè)關(guān)鍵字,是在 Java 中,然后 ES6 之后的 js 中也提供了 new 這個(gè)關(guān)鍵字,在 java 和 js 這兩門(mén)語(yǔ)言中,使用 new 關(guān)鍵詞可以實(shí)例化類(lèi)的對(duì)象。語(yǔ)義是相似的,但是其背后還是有些差異的,js 的 new 和 class 可能是一些語(yǔ)法糖。
那么有了這些對(duì) new 這個(gè)關(guān)鍵字用法的了解,我們今天來(lái)看一看 c++ 中提供 new 這個(gè)關(guān)鍵字的用途和用法。
我們都知道 c++ 一門(mén)效率和性能為先的語(yǔ)言,選擇 c++ 來(lái)開(kāi)發(fā)應(yīng)用多數(shù)考慮性能才選擇這門(mén)語(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++ 這門(mén)語(yǔ)言這大不一樣,一切都是程序員自己思考,如何分配內(nèi)存以及在適當(dāng)時(shí)機(jī)將其回收。
那么今天要聊的new和delete操作符就是用來(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 類(lèi)型大小的內(nèi)存,然后將指向這塊內(nèi)存地址指針?lè)祷亟optr這個(gè)我們之前定義好的用于存放int類(lèi)型大小的指針。
delete
隨后我們用delete來(lái)釋放指針ptr指向的內(nèi)存。
delete ptr;
接下來(lái)我們通過(guò) 3 個(gè)小例子,分別介紹如何使用 new 和 delete 為基本類(lèi)型、組數(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)類(lèi)成員函數(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 類(lèi)大小內(nèi)存空間,那么new操作符和malloc其實(shí)通常都做了找到一塊可以存放 Base 類(lèi)型數(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 類(lèi)型大小的數(shù)據(jù),因?yàn)?c++ 沒(méi)有像 Java 那樣的垃圾回收機(jī)制,所以需要手動(dòng)將這塊內(nèi)存釋放。
delete base;
這里值得提一下,就是delete和delete[]是 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語(yǔ)言 設(shè)計(jì)模式之訪問(wèn)者模式
這篇文章主要介紹了C語(yǔ)言 設(shè)計(jì)模式之訪問(wèn)者模式的相關(guān)資料,需要的朋友可以參考下2017-01-01
基于C++編寫(xiě)一個(gè)鍵盤(pán)提示音程序
首先講一下思路,這次制作的小黑子相當(dāng)于鍵盤(pán)提示音,輸入J,N,T,M,會(huì)發(fā)出“雞你太美”的聲音,連續(xù)按下JNTM則會(huì)發(fā)出“你干嘛啊,哎呦”的聲音,感興趣的可以了解一下2023-03-03
opencv3/C++實(shí)現(xiàn)光流點(diǎn)追蹤
今天小編就為大家分享一篇opencv3/C++實(shí)現(xiàn)光流點(diǎn)追蹤,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12
C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路
這篇文章主要介紹了C語(yǔ)言統(tǒng)計(jì)輸入字符各個(gè)字母出現(xiàn)頻率的解題思路,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-08-08
Qt編寫(xiě)地圖遷徙圖的實(shí)現(xiàn)示例
本文主要介紹了Qt編寫(xiě)地圖遷徙圖的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
超詳細(xì)分析C語(yǔ)言動(dòng)態(tài)內(nèi)存管理問(wèn)題
動(dòng)態(tài)內(nèi)存是相對(duì)靜態(tài)內(nèi)存而言的。所謂動(dòng)態(tài)和靜態(tài)就是指內(nèi)存的分配方式。動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存,本文帶你深入探究C語(yǔ)言中動(dòng)態(tài)內(nèi)存的管理2022-04-04
C語(yǔ)言的變量與常量 字符字符串與轉(zhuǎn)義字符詳解
這篇文章主要介紹了詳解C語(yǔ)言的變量與常量 字符字符串與轉(zhuǎn)義字符,包括其之間的區(qū)別是C語(yǔ)言入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2021-10-10
C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生成績(jī)管理系統(tǒng)課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07
使用C++實(shí)現(xiàn)給PDF文檔添加文字水印
這篇文章主要為大家詳細(xì)介紹了如何通過(guò)第三方國(guó)產(chǎn)庫(kù)Spire.PDF?for?C++來(lái)實(shí)現(xiàn)給PDF文檔添加文字水印,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11

