//malloc和free是函數,new和delete是運算子,不是函數,因此執行效率高。
//new 返回的是一個地址。
//用new分配陣列空間時不能指定初值。
//malloc會分配記憶體不會呼叫建構函式,new既分配記憶體又呼叫建構函式
//free會釋放記憶體不會呼叫解構函式,delete既釋放記憶體又呼叫解構函式
//new操作符從自由儲存區上爲物件動態分配記憶體空間,而malloc函數從堆上動態分配記憶體。
//new操作符記憶體分配成功時,返回的是物件型別的指針,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。而malloc記憶體分配成功則是返回void* ,需要通過強制型別轉換將void* 指針轉換成我們需要的型別。
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//malloc和free是函數,new和delete是運算子,不是函數,因此執行效率高。
//new 返回的是一個地址。
//用new分配陣列空間時不能指定初值。
//malloc會分配記憶體不會呼叫建構函式,new既分配記憶體又呼叫建構函式
//free會釋放記憶體不會呼叫解構函式,delete既釋放記憶體又呼叫解構函式
//new操作符從自由儲存區上爲物件動態分配記憶體空間,而malloc函數從堆上動態分配記憶體。
//new操作符記憶體分配成功時,返回的是物件型別的指針,型別嚴格與物件匹配,無須進行型別轉換,故new是符合型別安全性的操作符。而malloc記憶體分配成功則是返回void* ,需要通過強制型別轉換將void* 指針轉換成我們需要的型別。
class test
{
public:
test(int _a)
{
a = _a;
cout<< "我被構造了!" << endl;
}
~test()
{
cout<< "我被解構了!" << endl;
}
private:
int a;
};
int main()
{
//給普通變數分配記憶體
int* p1 = (int*)malloc(sizeof(int));//c
free(p1);
int* p2 = new int;//c++
delete(p2);
int* p3 = new int(30);
cout << p3 << endl;
delete(p3);
//給陣列分配記憶體
int* p4 = (int*)malloc(sizeof(int)*10);//c
p4[0] = 1;
free(p4);
int* p5 = new int[10];
p5[1] = 2;
delete[] p5;
//給物件分配記憶體
test* p6 = (test*)malloc(sizeof(test));
free(p6);
test* p7 = new test(10);//別忘了傳遞參數
delete p7;//new 能執行建構函式,delete能執行解構函式
//可以交叉使用嗎?
//普通變數
int* p8 = (int*)malloc(sizeof(int));
*p8 = 10;
delete p8;
int* p9 = new int[10];
p9[1] = 2;
free(p9);
//陣列型別
int* p10 = (int*)malloc(sizeof(int) * 10);//c
p10[0] = 1;
delete[] p10;
int* p11 = new int[10];
p11[1] = 2;
free(p11);
//類的物件
test* p12 = (test*)malloc(sizeof(test));
delete p12;
test* p13 = new test(10);//別忘了傳遞參數
free(p13);
return 0;
}