創(chuàng)作不易,本篇文章如果幫助到了你,還請點贊 關(guān)注支持一下?>??<)!!
主頁專欄有更多知識,如有疑問歡迎大家指正討論,共同進步!
??c++系列專欄:C/C++零基礎(chǔ)到精通 ??給大家跳段街舞感謝支持!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
c語言內(nèi)容??:
專欄:c語言之路重點知識整合
【c語言】全部知識點總結(jié)
一、c語言動態(tài)申請內(nèi)存空間
c語言堆區(qū)malloc相關(guān)知識點:【c語言】五大內(nèi)存區(qū)域 | 堆區(qū)詳解
使用malloc將堆區(qū)創(chuàng)建一個存儲空間并把局部變量存放進去,該數(shù)據(jù)如果不被手動回收,就會一直存放在堆區(qū)中。
釋放完后將指針p賦值為NULL,避免野指針的出現(xiàn)
int* p = (int*)malloc(sizeof(int));
//...........
free(p);
p = NULL;
在C++中,有一種全新的方式用來在堆區(qū)動態(tài)申請內(nèi)存空間——new
和delete
關(guān)鍵字
二、new-delete
使用new
關(guān)鍵字動態(tài)在堆區(qū)申請內(nèi)存空間,new
關(guān)鍵字后 放 類型,返回的是對應(yīng)類型的地址!!!
格式:new關(guān)鍵字 后加上類型名,在堆區(qū)申請該類型空間大小的空間
代替c語言中的malloc 還不用進行強轉(zhuǎn)
例如:
int* p1 = new int;
*p1 = 1;
cout << *p1 << endl;
使用delete
代替c語言中的free
釋放空間
但是delete不是函數(shù),關(guān)鍵字后直接加上要釋放空間的指針地址,仍然將指針p賦值為NULL:
int* p1 = new int;
*p1 = 1;
cout << *p1 << endl;
delete p1;
p1 = NULL;
基本數(shù)據(jù)
在int類型后加()
,可以賦予初始值
int* p2 = new int(7);
cout << *p2 << endl;
delete p2;
p2 = NULL;
如果未指定初始值,則初始值為0:
int* p3 = new int();
cout << *p3 << endl;
delete p3;
p3 = NULL;
數(shù)組
申請一個int型數(shù)組的堆區(qū)空間:
int* p4 = new int[3];
同樣可以賦予初始值:
int* p4 = new int[3] {1,2,3};
for (int i = 0; i < 3; i++)
{
cout << p4[i] << " ";
}
與基本數(shù)據(jù)類型不同的是:在delete數(shù)組的時候,需要在指針前加[]
用來代表數(shù)組,二維數(shù)組同樣
中括號[]放在前面,代表整個數(shù)組
例如:
delete []p4;
p4 = NULL;
注:
delete回收空間并不包含指針本身,而是指針指向的內(nèi)存空間,同一塊內(nèi)存空間不要重復釋放,除非指針已經(jīng)被賦空,對空指針使用delete是安全的。
對棧區(qū)的內(nèi)存空間不能使用delete來釋放!
三、new指針、new數(shù)組
只需要牢記:
使用new
關(guān)鍵字動態(tài)在堆區(qū)申請內(nèi)存空間,new
關(guān)鍵字后 放 類型,返回的是對應(yīng)類型的地址!!!
就兩種情況
- new指針——
- new數(shù)組——
1.new 整型指針
整型指針對應(yīng)的地址:二級指針,因此為int ** p1
int** p1 = new int*;
delete p1;
p1 = NULL;
2.new 指針數(shù)組
指針數(shù)組相關(guān)知識點:【c語言】指針數(shù)組
指針數(shù)組對應(yīng)的地址也是二級指針,因此為int ** p2
int** p2 = new int* [3];
delete []p2;
p2 = NULL;
3.new 數(shù)組指針
數(shù)組指針相關(guān)知識點:【c語言】數(shù)組指針
數(shù)組指針int(*p3)[3]
的指針 在類型上再加*
:int(**p3)[3]
int(**p3)[3] = new (int(*)[3]);
delete p3;
p3 = NULL;
4.new 整型的二維數(shù)組
指向二維數(shù)組的指針為:一維數(shù)組指針int(*p4)[3]
int(*p4)[3] = new int[2][3];
delete[]p4;
p4 = NULL;
5.new 函數(shù)指針
先隨便定義一個函數(shù):
void fun(int a)
{
cout << "TianXi Studio" << endl;
}
指向函數(shù)指針的地址:在函數(shù)指針void(*p5)(int)
基礎(chǔ)上加*
:void(**p5)(int)
void(**p5)(int) = new (void (*)(int));
delete p5;
p5 = NULL;
總結(jié)
malloc-free和new-delete的區(qū)別
-
new、delete
是關(guān)鍵字,需要C++的編譯器支持,malloc()、free()
是函數(shù),需要頭文件支持 -
new
申請空間不需要指定申請大小,根據(jù)類型自動計算,new
返回的是申請類型的地址,不需要強轉(zhuǎn),malloc()
需要顯式的指定申請空間的大小(字節(jié)),返回void*
,需要強轉(zhuǎn)成我們需要的類型。 -
new
申請空間的同時可以設(shè)置初始化,而malloc 需要手動賦值 -
malloc()
和free()
則不會調(diào)用構(gòu)造、析構(gòu)函數(shù)
在C語言中,常用的動態(tài)申請內(nèi)存空間的函數(shù)是malloc、calloc
和realloc
,并且需要手動free
釋放已分配的內(nèi)存空間
而在C++中,可以使用new操作符來動態(tài)創(chuàng)建一個對象或一段對象數(shù)組
new
可以自動調(diào)用構(gòu)造函數(shù)初始化對象,而delete
操作符則會自動調(diào)用析構(gòu)函數(shù),釋放分配的內(nèi)存空間(后面會提到)
使用delete
釋放動態(tài)分配的對象數(shù)組時記得加上方括號,否則只會釋放首個元素并不會將整個數(shù)組的內(nèi)存空間都釋放掉。文章來源:http://www.zghlxwxcb.cn/news/detail-470620.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-470620.html
大家的點贊、收藏、關(guān)注將是我更新的最大動力! 歡迎留言或私信建議或問題。 |
大家的支持和反饋對我來說意義重大,我會繼續(xù)不斷努力提供有價值的內(nèi)容!如果本文哪里有錯誤的地方還請大家多多指出(●'?'●) |
到了這里,關(guān)于【C/C++】基礎(chǔ)知識之動態(tài)申請內(nèi)存空間new-delete的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!