網(wǎng)站首頁 編程語言 正文
前言
最早接觸到new
這個(gè)關(guān)鍵字,是在 Java 中,然后 ES6 之后的 js 中也提供了 new 這個(gè)關(guān)鍵字,在 java 和 js 這兩門語言中,使用 new 關(guān)鍵詞可以實(shí)例化類的對(duì)象。語義是相似的,但是其背后還是有些差異的,js 的 new 和 class 可能是一些語法糖。
那么有了這些對(duì) new 這個(gè)關(guān)鍵字用法的了解,我們今天來看一看 c++ 中提供 new 這個(gè)關(guān)鍵字的用途和用法。
我們都知道 c++ 一門效率和性能為先的語言,選擇 c++ 來開發(fā)應(yīng)用多數(shù)考慮性能才選擇這門語言來開發(fā)應(yīng)用程序。 C++允許我們?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ī)將其回收。
那么今天要聊的new
和delete
操作符就是用來動(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ù)和對(duì)象來動(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;
這里值得提一下,就是delete
和delete[]
是 2 個(gè)不同的操作符,所以我們釋放數(shù)組時(shí)候需要選擇delete[]
而不是delete
。
int* arr_ptr = new int[20]; delete[] arr_ptr;
原文鏈接:https://juejin.cn/post/7114558008411045919
相關(guān)推薦
- 2022-03-22 詳解_beginthreadex()創(chuàng)建線程_C 語言
- 2022-05-28 Python讀取文件的四種方式的實(shí)例詳解_python
- 2022-07-06 Flutter?DateTime日期轉(zhuǎn)換的詳細(xì)使用_Android
- 2022-06-25 React?Hooks與setInterval的踩坑問題小結(jié)_React
- 2022-11-13 如何使用Python讀取.xlsx指定行列_python
- 2022-10-11 線上nginx偶爾出現(xiàn)502錯(cuò)誤
- 2022-04-17 python中無法導(dǎo)入本地安裝好的第三方庫問題_python
- 2022-08-23 Django配合python進(jìn)行requests請(qǐng)求的問題及解決方法_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支