網(wǎng)站首頁 編程語言 正文
c++中內(nèi)存管理的方式
在c語言中,我們擁有malloc和free等函數(shù)可以對內(nèi)存進行動態(tài)管理
但是總體來說不是很方便,所以c++擁有了一種新的方式來對內(nèi)存進行管理:通過new和delete操作符來對內(nèi)存進行動態(tài)分配
new和delete操作符的使用方式
new操作符的使用方式:
#include<iostream>
using namespace std;
class A
{};
int main()
{
int* p = new int(2); //動態(tài)分配一個int類型的空間,還可以將它初始化
int* p1 = new int[10]; //動態(tài)分配一個數(shù)組
A* p2 = new A; //動態(tài)分配一個類
return 0;
}
delete操作符的使用方式:
#include<iostream>
using namespace std;
class A
{};
int main()
{
int* p = new int(2);
int* p1 = new int[10];
A* p2 = new A;
delete p; //銷毀p
delete[] p1; //銷毀p1
delete p2; //銷毀p2
return 0;
}
注意:
1、對于自定義類型,new和delete會自動調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)對創(chuàng)建出的對象進行初始化,也可以顯示的寫出想要被初始化的值,而malloc和free不會
#include<iostream>
using namespace std;
class A
{
public:
A(int x = 1) :_x(x) {}
private:
int _x;
};
int main()
{
A* p = new A(2); //()括號內(nèi)為顯示的給對象初始化的值
return 0;
}
2、假如要銷毀數(shù)組類的內(nèi)容,最好使用[]來修飾一下,因為雖然對于內(nèi)置類型不會報錯,但是自定義類型會直接報錯
operator new和operator delete函數(shù)
new和delete是用戶進行動態(tài)內(nèi)存申請和釋放的操作符
operator new 和operator delete是系統(tǒng)提供的全局函數(shù)
new在底層調(diào)用operator new全局函數(shù)來申請空間
delete在底層通過operator delete全局函數(shù)來釋放空間
最終還是通過malloc和free來進行動態(tài)內(nèi)存分配,不過和c不同的是,c++空間申請失敗,會出現(xiàn)拋異常的情況,而不是返回NULL
new和delete的原理內(nèi)部實現(xiàn)
內(nèi)置類型
如果申請的是內(nèi)置類型的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請和釋放的是單個元素的空間,new[]和delete[]申請的是連續(xù)空間,而且new在申請空間失敗時會拋異常,malloc會返回NULL
自定義類型
如果是自定義類型,就有很大區(qū)別了
new的原理
1、調(diào)用operator new申請空間,
2、調(diào)用構(gòu)造自定義類型的構(gòu)造函數(shù)進行初始化
delete的原理
1、調(diào)用operator delete釋放空間
2、調(diào)用自定義類型的析構(gòu)函數(shù)進行初始化
所以我們使用c++的時候最好使用new和delete進行動態(tài)內(nèi)存開辟,因為這樣可以更方便進動態(tài)內(nèi)存管理,防止內(nèi)存泄露
原文鏈接:https://blog.csdn.net/qq_45358642/article/details/124201081
相關(guān)推薦
- 2022-05-20 PyQt5實現(xiàn)數(shù)據(jù)的增刪改查功能詳解_python
- 2022-04-30 Qt數(shù)據(jù)庫應(yīng)用之實現(xiàn)通用數(shù)據(jù)庫分頁_C 語言
- 2022-07-28 Python網(wǎng)絡(luò)編程之socket與socketserver_python
- 2022-10-09 python將寫好的程序打包成exe可執(zhí)行文件_python
- 2022-04-01 git clone 失敗
- 2022-04-12 Redis?Server啟動過程的詳細步驟_Redis
- 2022-03-17 c++實現(xiàn)一個簡易的網(wǎng)絡(luò)緩沖區(qū)的實踐_C 語言
- 2023-03-20 使用Redis緩存時高效的批量刪除的幾種方案_Redis
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支