C++內(nèi)存管理詳解使用方式
c++中內(nèi)存管理的方式
在c語言中,我們擁有malloc和free等函數(shù)可以對(duì)內(nèi)存進(jìn)行動(dòng)態(tài)管理
但是總體來說不是很方便,所以c++擁有了一種新的方式來對(duì)內(nèi)存進(jìn)行管理:通過new和delete操作符來對(duì)內(nèi)存進(jìn)行動(dòng)態(tài)分配
new和delete操作符的使用方式
new操作符的使用方式:
#include<iostream>
using namespace std;
class A
{};
int main()
{
int* p = new int(2); //動(dòng)態(tài)分配一個(gè)int類型的空間,還可以將它初始化
int* p1 = new int[10]; //動(dòng)態(tài)分配一個(gè)數(shù)組
A* p2 = new A; //動(dòng)態(tài)分配一個(gè)類
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、對(duì)于自定義類型,new和delete會(huì)自動(dòng)調(diào)用構(gòu)造函數(shù)和析構(gòu)函數(shù)對(duì)創(chuàng)建出的對(duì)象進(jìn)行初始化,也可以顯示的寫出想要被初始化的值,而malloc和free不會(huì)
#include<iostream>
using namespace std;
class A
{
public:
A(int x = 1) :_x(x) {}
private:
int _x;
};
int main()
{
A* p = new A(2); //()括號(hào)內(nèi)為顯示的給對(duì)象初始化的值
return 0;
}2、假如要銷毀數(shù)組類的內(nèi)容,最好使用[]來修飾一下,因?yàn)殡m然對(duì)于內(nèi)置類型不會(huì)報(bào)錯(cuò),但是自定義類型會(huì)直接報(bào)錯(cuò)
operator new和operator delete函數(shù)
new和delete是用戶進(jìn)行動(dòng)態(tài)內(nèi)存申請(qǐng)和釋放的操作符
operator new 和operator delete是系統(tǒng)提供的全局函數(shù)
new在底層調(diào)用operator new全局函數(shù)來申請(qǐng)空間
delete在底層通過operator delete全局函數(shù)來釋放空間
最終還是通過malloc和free來進(jìn)行動(dòng)態(tài)內(nèi)存分配,不過和c不同的是,c++空間申請(qǐng)失敗,會(huì)出現(xiàn)拋異常的情況,而不是返回NULL
new和delete的原理內(nèi)部實(shí)現(xiàn)
內(nèi)置類型
如果申請(qǐng)的是內(nèi)置類型的空間,new和malloc,delete和free基本類似,不同的地方是:new/delete申請(qǐng)和釋放的是單個(gè)元素的空間,new[]和delete[]申請(qǐng)的是連續(xù)空間,而且new在申請(qǐng)空間失敗時(shí)會(huì)拋異常,malloc會(huì)返回NULL
自定義類型
如果是自定義類型,就有很大區(qū)別了
new的原理
1、調(diào)用operator new申請(qǐng)空間,
2、調(diào)用構(gòu)造自定義類型的構(gòu)造函數(shù)進(jìn)行初始化
delete的原理
1、調(diào)用operator delete釋放空間
2、調(diào)用自定義類型的析構(gòu)函數(shù)進(jìn)行初始化
所以我們使用c++的時(shí)候最好使用new和delete進(jìn)行動(dòng)態(tài)內(nèi)存開辟,因?yàn)檫@樣可以更方便進(jìn)動(dòng)態(tài)內(nèi)存管理,防止內(nèi)存泄露
到此這篇關(guān)于C++內(nèi)存管理詳解使用方式的文章就介紹到這了,更多相關(guān)C++內(nèi)存管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線程池的示例代碼
本文主要介紹了C++實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線程池的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢
C++實(shí)現(xiàn)二叉樹的堂兄弟節(jié)點(diǎn)查詢,是指在二叉樹中,找到兩個(gè)節(jié)點(diǎn)深度相同但父節(jié)點(diǎn)不同的節(jié)點(diǎn),即為堂兄弟節(jié)點(diǎn)。實(shí)現(xiàn)這一功能可以通過遍歷二叉樹并記錄節(jié)點(diǎn)深度和父節(jié)點(diǎn)來實(shí)現(xiàn)2023-04-04
判斷指定的進(jìn)程或程序是否存在方法小結(jié)(vc等)
VC判斷進(jìn)程是否存在?比如我想知道記事本是否運(yùn)行,要用到哪些函數(shù)等實(shí)例,需要的朋友可以參考下2013-01-01
詳解QTreeWidget隱藏節(jié)點(diǎn)的兩種方式
本文主要介紹了QTreeWidget隱藏節(jié)點(diǎn)的兩種方式,一種是直接隱藏,一種是間接隱藏,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
C語言實(shí)現(xiàn) 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)
這篇文章主要介紹了 C語言 數(shù)據(jù)類型占多少字節(jié)指針占多少字節(jié)的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09

