網(wǎng)站首頁 編程語言 正文
前言
最早接觸到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ī)將其回收。
那么今天要聊的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ù)和對象來動(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-07-21 Error: rsync: [sender] safe_read failed to read 4
- 2022-10-26 Flutter?EventBus事件總線的應(yīng)用詳解_Android
- 2022-08-05 基于redis+lua進(jìn)行限流
- 2022-05-14 C++使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存分配與數(shù)組封裝_C 語言
- 2022-05-11 解決Spring Boot報(bào)錯(cuò)Mapped Statements collection alread
- 2022-04-28 python中對列表的刪除和添加方法詳解_python
- 2022-09-08 深入了解Go語言的基本語法與常用函數(shù)_Golang
- 2023-07-04 如何替換spring boot中spring框架的版本
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- 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)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支