1.相同点
1)返回值:成功:返回地址空间
失败:NULL
2)使用之前都要进行判断是否为空
3) 释放空间的方式:free
4) 返回值:void* (可以强制类型转换)
2.不同点
1) malloc 参数:(字节数) 功能:负责将空间给出
2)calloc 参数:(单个元素字节数,元素个数) 功能:给出空间,且对空间进行初始化为0
3) realloc 参数:(地址p, 字节数newsize) 功能:将p所在的内存大小(oldsize)调整到newsize大小。
若p为NULL,则realloc功能和malloc相同。
若p不为NULL:
1、C++管理内存的例子
2.总结:
new 做了两件事:1)调用operator new 分配空间
2)调用构造函数初始化对象
delete也做了两件事:1)调用析构函数清理对象
2)调用operator delete 释放空间
new [N] :1) 调用operator new 分配空间
2) 调用N次构造函数初始化每个对象
delete [N]: 1)调用N次析构函数清理对象 (栈序,倒着销毁)(4中给出N的由来,请看下面)
2) 调用operator delete 释放空间 (空间起始位置进行free)
编译器在new出的数组对象头指针向前4个字节中记录了对象的数目(4个字节对应一个int值)
注意:new和delete、new[ ]和delete[ ] 一定要匹配使用!!!
malloc / free 在C++中也是可以使用的,只是malloc和free在C++中不能分别调用构造函数和析构函数来初始化对象和释放对象
3.不同的类型内存泄漏问题
对于内置对象,如果没有匹配释放,不会造成内存泄漏。
对于自定义类型(class,struct)且析构函数显式给出的情况:
1)如果没有匹配使用,内存泄漏&程序崩溃。
2)如果析构函数没有给出,也没有来匹配使用,可能会造成内存泄漏。
.4.析构函数对内存泄漏的影响
1)给出析构函数
malloc ---> delete / delete [ ] (free)
new ------>delete / delete [ ] (free)
new [ ]-----> delete / delete [ ] (free)
2)没有给出析构函数
new--->free : 对象中的资源没有清理
new---->delete [ ] :一定会崩溃
new [ ] ---> free :对象中的资源没有清理&一定会崩溃
new [ ]--->delete :只会销毁一个对象(N-1)个对象没有清理&一定会崩溃。
1.含义:在已经存在的空间上执行构造函数
2.定义语法:new (地址)类型
3.调用方式:operator new (size_t void*where)比如:
int main()
{
Test* pt=(Test*)malloc(sizeof(Test));
new (pt) Test;//定位new表达式
return 0;
}
1.malloc / free :C语言中 new / delete :C++中
2.malloc / free :是函数 new / delete : 操作符
3.参数上:malloc(字节数) new + 类型
4.返回值上:malloc-->void* (可以强制转换) new 不需要
5.malloc 要判断是否为空 new 有应用措施,不要判空,捕获异常
6.malloc / free :不会调用构造/析构函数 new/delete:会调用构造/析构函数
7.malloc :不能初始化 new可以初始化
8.malloc :在堆上申请 new:不一定在堆上,operator new(可以自定义申请的位置空间)
1.使用系统自带的内存泄漏的检测工具。
2.自己写一个内存泄漏检测工具。
3.使用第三方工具:VLD,DebugDiag Tools等。
1 良好的编程规范
2.智能指针