码迷,mamicode.com
首页 > 编程语言 > 详细

C++拾遗--malloc free与new delete的同与不同

时间:2015-02-20 20:54:22      阅读:156      评论:0      收藏:0      [点我收藏+]

标签: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指向的内存。





本专栏目录

所有内容的目录




C++拾遗--malloc free与new delete的同与不同

标签:malloc   free   new   delete   

原文地址:http://blog.csdn.net/zhangxiangdavaid/article/details/43889365

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!