?C++?new?和?delete?關鍵字詳解
前言
最早接觸到new
這個關鍵字,是在 Java 中,然后 ES6 之后的 js 中也提供了 new 這個關鍵字,在 java 和 js 這兩門語言中,使用 new 關鍵詞可以實例化類的對象。語義是相似的,但是其背后還是有些差異的,js 的 new 和 class 可能是一些語法糖。
那么有了這些對 new 這個關鍵字用法的了解,我們今天來看一看 c++ 中提供 new 這個關鍵字的用途和用法。
我們都知道 c++ 一門效率和性能為先的語言,選擇 c++ 來開發(fā)應用多數(shù)考慮性能才選擇這門語言來開發(fā)應用程序。 C++允許我們在運行時為一個變量或一個數(shù)組分配內(nèi)存。這就是的動態(tài)內(nèi)存分配。在 java 和 js 這樣語言中,編譯器都是內(nèi)存分配和回收機制,開發(fā)人員不用為內(nèi)存管理而花費時間和精力。但是在 c++ 這門語言這大不一樣,一切都是程序員自己思考,如何分配內(nèi)存以及在適當時機將其回收。
那么今天要聊的new
和delete
操作符就是用來動態(tài)地分配和回收內(nèi)存。
new 和 delete 的使用
new
int* ptr; ptr = new int; *ptr = 2; cout << *ptr << endl;
這里new
動態(tài)地獲取一塊大小為 int 類型大小的內(nèi)存,然后將指向這塊內(nèi)存地址指針返回給ptr
這個我們之前定義好的用于存放int
類型大小的指針。
delete
隨后我們用delete
來釋放指針ptr
指向的內(nèi)存。
delete ptr;
接下來我們通過 3 個小例子,分別介紹如何使用 new 和 delete 為基本類型、組數(shù)和對象來動態(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ù)組動態(tài)地分配了內(nèi)存,返回指針是指向內(nèi)存第一個元素的地址。
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; }
注意箭頭運算符->
,當通過指針訪問類成員函數(shù)時候會用到->
。
那么new
主要做了什么事情,尋找合適大小內(nèi)存,然后將指向內(nèi)存地址的指針返回給你,注意這時new
不僅負責分配了Tut
大小的內(nèi)存,同時還調(diào)用了Tut
的構(gòu)造函數(shù)。
void* operator new(size_t size)
void operator delete(void*);
malloc 和 new
有時候我們通??梢杂?code>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
其實通常都做了找到一塊可以存放 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[]
使用關鍵字 new 在堆上開辟一塊內(nèi)存用于存放 Base 類型大小的數(shù)據(jù),因為 c++ 沒有像 Java 那樣的垃圾回收機制,所以需要手動將這塊內(nèi)存釋放。
delete base;
這里值得提一下,就是delete
和delete[]
是 2 個不同的操作符,所以我們釋放數(shù)組時候需要選擇delete[]
而不是delete
。
int* arr_ptr = new int[20]; delete[] arr_ptr;
到此這篇關于 C++ new 和 delete 關鍵字詳解的文章就介紹到這了,更多相關 C++ new 和 delete 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路
這篇文章主要介紹了C語言統(tǒng)計輸入字符各個字母出現(xiàn)頻率的解題思路,具有一定的參考價值,感興趣的小伙伴們可以參考一下2015-08-08