new delete mallco free 的深刻理解

来源:互联网 发布:北京汽车美容软件 编辑:程序博客网 时间:2024/06/15 09:35

new delete mallco free 的深刻理解

首先理解 c语言的mallco和free
函数原型: void* mallco(long NumBytes)该函数分配了NumBytes 个字节的内存空间并返回指向这块内存空间的指针
函数的参数是要分配的字节的长度 一般用sizeof函数求一下 所以mallco只知道要分配多少的字节 不知道分配的是个怎样的数据类型!!!
所以mallco的返回值是void*类型的 如果分配失败会返回NULL
那么在将mallco函数返回的指针赋值给我们定义的指针变量之前 需要对这个返回值进行强制类型转化 将void*类型的指针转化成我们想要赋予的指针的类型
简而言之 麻烦 我们需要显示的告诉编译器需要分配多少字节的内存 并且我们需要知道这个地址将要赋给怎样的一个数据类型!!

void free(void* FiretByte) 释放内存空间 参数是要释放的内存空间的首地址

malloc函数的参数是接受需要分配的内存字节数,如果内存能够满足请求量,那么将会返回:指向被分配的内存块起始位置

free函数释放的是指针指向的内存(不是释放的指针本身,不会删除指针本身),其中指针必须指向所释放内存空间的首地址

下面来看看c++里new和delete
new的时候会有两个事情发生:一个是分配内存 第二个就是为被分配的内存调用一个或多个构造函数构造对象
delete 的时候也是两件事情发生: 一个是为将释放的内存调用一个或多个析构函数 第二个是释放内存

使用delete是未加括号,delete便假设删除对象是单一对象。否则便假设删除对象是个数组
因此,如果在调用new时使用了[],则在调用delete时也使用[],如果你在调用new的时候没有[],那么也不应该在调用时使用[]。

malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符 有意思 运算符
new能够自动分配空间大小
对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
-简而言之 new/delete能进行对对象进行构造和析构函数的调用进而对内存进行更加详细的工作,而malloc/free不能

既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。如果用free释放“new创建的动态对象”,那么该对象因无法执行析构函数而可能导致程序出错。
如果用delete释放“malloc申请的动态内存”,理论上讲程序不会出错,但是该程序的可读性很差。所以new/delete,malloc/free必须配对使用。

原创粉丝点击