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