C++拾遺--malloc free與new delete的同與不同

                   C++拾遺--malloc free與new delete的同與不同

前言

    在C中我們常使用malloc和free來動態分配與釋放內存,在C++中對應的是new和delete。這裏我們來探討下他們的同與不同。

正文

1.內置類型

對相同的代碼進行調試,查看內存

#include <iostream>
using namespace std;
int main()
{
	int *p = (int*)malloc(sizeof(int) * 10);
	cout << p << endl;
	//斷點
	for (int i = 0; i < 10; i++)
		p[i] = i;
	//斷點
	free(p);
	//斷點
	cin.get();
	return 0;
}

調試



同樣的功能使用new和delete來操作

#include <iostream>
using namespace std;
int main()
{
	int *p = new int[10];
	cout << p << endl;
<span style="white-space:pre">	</span>//斷點
	for (int i = 0; i < 10; i++)
		p[i] = i;
<span style="white-space:pre">	</span>//斷點
	delete[]p;
<span style="white-space:pre">	</span>//斷點
	cin.get();
	return 0;
}
調式



對於內置類型,兩組操作的效果是一樣的。


2.類類型

代碼一

#include <iostream>
using namespace std;
class MyClass
{
public:
	MyClass()
	{
		cout << "MyClass create" << endl;
	}
	~MyClass()
	{
		cout << "MyClass delete" << endl;
	}
};
int main()
{
	MyClass *p1 = (MyClass *)malloc(sizeof(MyClass));
	free(p1);
	cout << "--------------------" << endl;
	MyClass *p2 = new MyClass;
	delete p2;
	cin.get();
	return 0;
}
運行


malloc 只是分配了內存,而new 不僅分配了內存,還調用了構造函數。

free 只是釋放了內存,而delete不僅釋放了內存,還調用了析構函數。


代碼

#include <iostream>
#include <new>
using namespace std;
class MyClass
{
public:
	int *p;
	MyClass()
	{
		//分配400M內存
		p = new int[1024 * 1024 * 100];
		cout << "MyClass create" << endl;
	}
	~MyClass()
	{
		delete[]p;
		cout << "MyClass delete" << endl;
	}
};
int main()
{
	MyClass *p1 = (MyClass *)malloc(sizeof(MyClass));
	//斷點
	free(p1);
	//斷點
	MyClass *p2 = new MyClass;
	//斷點
	delete p2;
	//斷點
	cin.get();
	return 0;
}
啓動任務管理器,查看內存消耗

malloc free



new delete



由於malloc只是給變量p本身分配了內存,但由於不調用構造函數,所以無法讓p指向一片分配的內存。同理,free只是釋放了變量p,由於並不調用析構函數,所以無法釋放p指向的內存。





本專欄目錄

所有內容的目錄




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章