new/delete和malloc/free的区别(举例说明)(简单点)
生活随笔
收集整理的这篇文章主要介绍了
new/delete和malloc/free的区别(举例说明)(简单点)
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
先说说区别:
1. new/delete是C++里才有的。
2. new/delete通常来说是操作符,就是"+","-"一样。
3. new/delete是可以重载的,而重载之后,就成为了函数。
4. malloc在申请内存的时候,必须要提供申请的长度,而且返回的指针是void*型,必须要强转成需要的类型。
5. 当new/delete在类中被重载的时候,可以自定义申请过程,比如记录所申请内存的总长度,以及跟踪每个对象的指针。
6. new/delete,其实内部也调用了malloc/free。
共同点:
1. 都必须配对使用。
2. 都是申请内存,释放内存。
3. free和delete可以释放NULL指针。
注意点:
new/delete与malloc/free不能混合使用。举几个简单的例子吧:
int* pn = (int*)malloc(sizeof(int));
*pn = 15;
free(pn);
pn = NULL; // 置空
free(pn); // OK,没有问题
double* pd = new double;
*pd = 212.211;
delete = pd;
short* ps = new short[128]; // new出一个数组来
ps[1] = 1231;
ps[11] = 1111;
delete[] ps; // 请注意delete的语法。// 以下是一个重载new操作符的例子,一般来说是不会用到的,除非要设计一个编译器之类的东西。
class Sample
{
public:static CSample* operator= new(){CSample* p = (CSample*)malloc(size(Sample));return p;}
}
好 我简单的说下,楼上说的很多了,我也发表一点愚见1 我认为new\delete和malloc\free最大区别是对对象的理解。 如果你使用 Foo* foo = malloc(sizeof(Foo));//Foo是一个类 初始化,那么你将不会调用Foo的构造方法,而只是单纯的分配空间。而且我们只认为你是分配一个空间,而不是想创建一个对象。 Foo* foo = new Foo();则会调用Foo的构造方法来初始化对象,也就是说你既要分配空间又要初始化这段空间,让它变成一个对象。 对于delete和free也有同样的问题,就是delete会调用析构函数,free则不会。 说白了,new\delete玩的是对象,而malloc\free仅仅是内存空间而已2 对于除去对象意外的其他情况,比如int和float等 int* Array=new int[10];和int* Array=malloc(sizeof(int)*10);只存在使用技巧的差别,没有本质的差别。3 最后也提醒你new\delete和malloc\free只能成对使用,不能混了。
好 我简单的说下,楼上说的很多了,我也发表一点愚见1 我认为new\delete和malloc\free最大区别是对对象的理解。 如果你使用 Foo* foo = malloc(sizeof(Foo));//Foo是一个类 初始化,那么你将不会调用Foo的构造方法,而只是单纯的分配空间。而且我们只认为你是分配一个空间,而不是想创建一个对象。 Foo* foo = new Foo();则会调用Foo的构造方法来初始化对象,也就是说你既要分配空间又要初始化这段空间,让它变成一个对象。 对于delete和free也有同样的问题,就是delete会调用析构函数,free则不会。 说白了,new\delete玩的是对象,而malloc\free仅仅是内存空间而已2 对于除去对象意外的其他情况,比如int和float等 int* Array=new int[10];和int* Array=malloc(sizeof(int)*10);只存在使用技巧的差别,没有本质的差别。3 最后也提醒你new\delete和malloc\free只能成对使用,不能混了。
总结
以上是生活随笔为你收集整理的new/delete和malloc/free的区别(举例说明)(简单点)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: IOCP之accept、AcceptEx
- 下一篇: new/delete和malloc/fr