C++ 对象动态建⽴和释放 new 和 delete
在開發(fā)過程中,常常需要?jiǎng)討B(tài)地分配和撤銷內(nèi)存空間,例如對(duì)動(dòng)態(tài)鏈表中結(jié)點(diǎn)的插入與刪除。在C語言中是利用庫函數(shù)malloc和free來分配和撤銷內(nèi)存空間的。C++提供了較簡便而功能較強(qiáng)的運(yùn)算符new和delete來取代malloc和free函數(shù)。
在C++中因?yàn)閚ew和delete是運(yùn)算符,不是函數(shù),因此執(zhí)行效率高。
雖然為了與C語言兼容,C++仍保留malloc和free函數(shù),建議不用malloc和free函數(shù),而用new和delete運(yùn)算符。
new int; // 開辟?個(gè)存放整數(shù)的存儲(chǔ)空間,返回?個(gè)指向該存儲(chǔ)空間的地址(即指針) new int(100); // 開辟?個(gè)存放整數(shù)的空間,并指定該整數(shù)的初值為100,返回?個(gè)指向該存儲(chǔ)空間的地址 new char[10]; // 開辟?個(gè)存放字符數(shù)組(包括10個(gè)元素)的空間,返回?元素的地址 new int[5][4]; // 開辟?個(gè)存放?維整型數(shù)組(??為5*4)的空間,返回?元素的地址 float *p = new float(3.14159); // 開辟?個(gè)存放單精度數(shù)的空間,并指定該實(shí)數(shù)的初值為//3.14159,將返回的該空間的地址賦給指針變量p #include <iostream> #include <cstdlib>using namespace std;class Test{public:Test(){m_a = 0;m_b = 0;cout << "0,0 構(gòu)造" << endl;}Test(int a, int b){m_a = a;m_b = b;cout << "a = " << m_a << ", b = " << m_b << "構(gòu)造 " << endl;}void setA(int a){m_a = a;}void setB(int b){m_b = b;}void printT(){cout << "a = " << m_a << ", b = " << m_b << endl;}~Test(){cout << "a = " << m_a << ", b = " << m_b << "析構(gòu) " << endl;}private:int m_a;int m_b; };//C語言中 void test1(){int* p = (int*)malloc(sizeof(int));*p = 10;cout << *p << endl;if (p != NULL) {free(p);//delete p; //delete 可以釋放malloc的開辟的內(nèi)存}int* array_p = (int*)malloc(sizeof(int) * 10);for (int i = 0; i < 10; i++) {array_p[i] = i + 10;}for (int i = 0; i < 10; i++) {cout << array_p[i] << endl;}if (array_p != NULL) {free(array_p);}cout << " -------- " << endl;Test* tp = (Test*)malloc(sizeof(Test)); //不會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)//p(10, 20);tp->setA(10);tp->setB(20); //malloc出來的對(duì)象指針,只能夠通過成員函數(shù)來進(jìn)行初始化tp->printT();if (tp != NULL) {free(tp); //不會(huì)調(diào)用對(duì)象的析構(gòu)} }//malloc 和free 在對(duì)于普通變量是可以混合使用的,但是malloc和free是函數(shù), //new 和delete 是操作符。不是一個(gè)函數(shù)。//C++中的new delete void test2(){//new 能夠完成所有malloc的需求int* p = new int; //在堆上動(dòng)態(tài)開辟4個(gè)字節(jié)*p = 10;cout << *p << endl;if (p != NULL) {//delete p; //delete 一個(gè)變量free(p); //用new開辟的內(nèi)存, free也能夠釋放。}cout << "-----" << endl;int* array_p = new int[10];for (int i = 0; i < 10; i++) {array_p[i] = i + 10;}for (int i = 0; i < 10; i++) {cout << array_p[i] << endl;}if (array_p != NULL) {delete[] array_p; //delete 一個(gè)數(shù)組 // delete 數(shù)組的時(shí)候,雖然[]可以省略,程序運(yùn)行的時(shí)候會(huì)自動(dòng)處理和優(yōu)化,但是為了方便代碼的閱讀,在delete數(shù)組的時(shí)候,需要在delete后面加上 []}cout << "-------" << endl;//Test *tp = new Test(10, 20);//調(diào)用了有參數(shù)的構(gòu)造函數(shù) //new 在創(chuàng)建一個(gè)對(duì)象的時(shí)候,會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)Test* tp = new Test;//調(diào)用了無參構(gòu)造函數(shù)tp->printT();if (tp != NULL) {delete tp; //delete在釋放一個(gè)對(duì)象指針的時(shí)候,會(huì)調(diào)用對(duì)象析構(gòu)函數(shù)tp = NULL;} }int main(void){//test1();test2();return 0; }-
new 運(yùn)算符動(dòng)態(tài)分配堆內(nèi)存
使用形式:指針變量 = new 類型(常量);
指針變量 = new 類型[表達(dá)式];
作用:從堆分配一塊“類型”大小的存儲(chǔ)空間,返回首地址
其中:“常量”是初始化值,可缺省創(chuàng)建數(shù)組對(duì)象時(shí),不能為對(duì)象指定初始值
-
delete 運(yùn)算符釋放已分配的內(nèi)存空間
使用形式:delete 指針變量;
delete[] 指針變量;
其中:“指針變量”必須是一個(gè) new 返回的指針
注:
用new分配數(shù)組空間時(shí)不能指定初值。如果由于內(nèi)存不足等原因而無法正常分配空間,則new會(huì)返回一個(gè)空指針NULL,用戶可以根據(jù)該指針的值判斷分配空間是否成功。
總結(jié):
- malloc不會(huì)調(diào)用類的構(gòu)造函數(shù),而new會(huì)調(diào)用類的構(gòu)造函數(shù)
- free不會(huì)調(diào)用類的析構(gòu)函數(shù),而delete會(huì)調(diào)用類的析構(gòu)函數(shù)
總結(jié)
以上是生活随笔為你收集整理的C++ 对象动态建⽴和释放 new 和 delete的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ 不能在构造函数中调用构造函数
- 下一篇: C++ 使用静态变量和静态方法统计学生分