new是个运算符 使用:= new 类型(初始值);
malloc和new的区别:
1--new申请空间失败抛出异常,malloc返回空指针
ip(new(nothrow) Int(10))//不想它抛出异常
2--new调用构造函数
3--new可以重载(运算符)
4--new不用强制类型转换,应用比较简单,new申请内存无需指定内存大小
new 的4步
1.计算大小2.malloc申请大小3.创建对象4.返回地址
delete
delete时被删除的空间被填充成0xdddddddd
new申请数组时释放空间必须用delete[],如果只delete一个会出错。
若new一个,却用了delete[]会导致不停的释放空间。
delete[]怎么知道删除多少个?
当new一个数组时,new创建空间sizeof(Int)*n+4,4是放new指针的数量的位置
空间上下分别还多4个字节放在头,尾分别是上越界标记、下越界标记,填充为fdfdfdfd,
最上部份有头部信息指向前一个指针,和下一个指针会把分配的字节串成一个链,
delete[]时从数组头向前读4个字节,读取那个4字节知道要析构多少次。
申请一个对象,删除一组会死循环。
申请一个对象没有多的4个标记,用delete[]删会将上越界标记当要删除的个数,fdfdfd很大。
申请字节数越小,辅助空间越大,头部越界标记等占比越大。
内存泄漏的本质:
丢失内存地址,找不回地址了,永远不会释放了。
ptmalloc
ptmalloc是内核中的内存管理,free的空间在此暂存一段时间,
申请字节有一个阈值,小于阈值直接在这里面找,减少对内核空间的扰动