new和delete

2020-08-13 20:41:53

 new和malloc的區別

//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;
}