malloc和new的区别

malloc/free(标准库函数)是C语言中一对配合使用的申请/释放内存函数

malloc

函数原型:void* malloc(unsigned int size)
使用示例:data* k = ( data*)malloc(sizeof( data)); malloc左边地括号是类型转换。

1、如果malloc开辟内存失败时,返回NULL指针。
2、使用malloc函数时要声明分配内存的大小(sizeof( data))。

malloc函数从上动态分配内存。它开辟一块长度为size的连续内存空间,返回类型为void类型的指针。在使用malloc开辟一段空间时,void*要显示的转换为所需要的类型,如果开辟失败,则返回NULL指针

free

函数原型:void free(void *_Memory)
使用示例:free(k);

1、free()函数只能释放堆内存,也就是malloc()函数所创建的。
2、malloc和free要配套使用,如果没有free则会造成内存泄漏。
3、free释放的不是指针,而是指针指向的内存空间。

free(k);
	k->nk = 10;
	cout<<k->nk<<endl;//输出10

可能看到在上面的代码中,你也会很疑惑,k不是已经被free释放了吗?为什么还能赋值输出呢?
看了网上的解释,我才知道
发现free后只是做了个标记,告诉系统这块内存不用了,一旦调用free释放后, 那个地址是不被保护的, 也就是说其他的变量随时可能占用那个地址。


free(k);
	//k->nk = 10;
	cout<<k->nk<<endl;//输出1907184 

如果没有k->nk = 10;这一语句的话,cout


free(k);
	k->nk = 10;
	data* f = ( data*)malloc(sizeof( data));
	cout<<k->nk<<endl;//什么都不输出

通过上面几段程序,我所理解的free函数是这样的,free之后它没有释放指针,他只是释放了指针所指向的内存空间里之前操作留下的数据,看第二段程序我们可以知道,它没有free之前输出的是之前存下的数据,free之后输出的是一个我们未曾知道的一个陌生值。结合看第一段程序我们可以知道,指针k还存在,且赋值后依然能被输出。再结合第三段程序我们可以知道,free之后再为另一个新对象malloc一段内存空间时,之前的对象所指向的内存空间将有可能被新申请的对象所占用,所以才输出不了结果。下面的delete也类似。

new/delete(C++运算符)是C++中一对配合使用的申请/释放内存函数

new

使用示例:data* d = new data;

1、如果new内存分配失败时,会抛出异常。
2、使用new时,无需声明内存大小,编译器会根据类型信息自行计算。

new操作符从自由存储区上为对象动态分配内存空间。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请,该内存即为自由存储区。而malloc提到的堆是操作系统中的术语,是操作系统所维护的一块特殊内存,用于程序的内存动态分配。

delete

使用示例1:delete 指针名 | example: delete k;
使用示例2:delete []数组名 | example: delete []array;

delete和free作用差不多,这里就不赘述了。

下面是malloc和new两种申请内存方法不同之处的对比表

特征 new/delete malloc/free
分配内存的位置 自由存储区
返回类型安全性 完整类型指针 void*
内存分配失败返回值 默认抛出异常 返回NULL
分配内存的大小 由编译器根据类型计算得出 必须显式指定字节数
处理数组 有处理数组的new版本new[] 需要用户计算数组的大小后进行内存分配
已分配内存的扩充 无法直观地处理 使用realloc简单完成
是否相互调用 可以,看具体的operator new/delete实现 不可调用new
分配内存时内存不足 无法通过用户代码进行处理 能够使用realloc函数或重新制定分配器
函数重载 允许 不允许
构造函数与析构函数 调用 不调用

你可能感兴趣的:(C/C++,c++,malloc)