C++內(nèi)存管理詳解使用方式
c++中內(nèi)存管理的方式
在c語言中,我們擁有malloc和free等函數(shù)可以對內(nèi)存進(jìn)行動態(tài)管理
但是總體來說不是很方便,所以c++擁有了一種新的方式來對內(nèi)存進(jìn)行管理:通過new和delete操作符來對內(nèi)存進(jìn)行動態(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)建出的對象進(jìn)行初始化,也可以顯示的寫出想要被初始化的值,而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是用戶進(jìn)行動態(tài)內(nèi)存申請和釋放的操作符
operator new 和operator delete是系統(tǒng)提供的全局函數(shù)
new在底層調(diào)用operator new全局函數(shù)來申請空間
delete在底層通過operator delete全局函數(shù)來釋放空間
最終還是通過malloc和free來進(jìn)行動態(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ù)進(jìn)行初始化
delete的原理
1、調(diào)用operator delete釋放空間
2、調(diào)用自定義類型的析構(gòu)函數(shù)進(jìn)行初始化
所以我們使用c++的時候最好使用new和delete進(jìn)行動態(tài)內(nèi)存開辟,因為這樣可以更方便進(jìn)動態(tài)內(nèi)存管理,防止內(nèi)存泄露
到此這篇關(guān)于C++內(nèi)存管理詳解使用方式的文章就介紹到這了,更多相關(guān)C++內(nèi)存管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何利用C++實現(xiàn)mysql數(shù)據(jù)庫的連接池詳解
為了提高M(jìn)ySQL數(shù)據(jù)庫的訪問的瓶頸,除了在服務(wù)器端增設(shè)緩存服務(wù)器緩存常用的數(shù)據(jù)之外(如redis),還可以增加數(shù)據(jù)庫連接池,來提高M(jìn)ySQL Server的訪問效率,這篇文章主要給大家介紹了關(guān)于如何利用C++實現(xiàn)mysql數(shù)據(jù)庫的連接池的相關(guān)資料,需要的朋友可以參考下2021-07-07
解析C++中多層派生時的構(gòu)造函數(shù)及一些特殊形式
這篇文章主要介紹了解析C++中多層派生時的構(gòu)造函數(shù)及一些特殊形式,特殊形式主要針對基類和子對象類型的構(gòu)造函數(shù)內(nèi)容,需要的朋友可以參考下2015-09-09
C++如何計算二進(jìn)制數(shù)中1的個數(shù)
這篇文章主要介紹了C++如何計算二進(jìn)制數(shù)中1的個數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
關(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)
下面小編就為大家?guī)硪黄P(guān)于C++中構(gòu)造函數(shù)初始化成員列表的總結(jié)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-12-12
C++中BitSet和Bloom_Filter的實現(xiàn)
本文主要介紹了C++中BitSet和Bloom_Filter的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

