版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_39087263/article/details/83897677
幕布分享: https://mubu.com/doc/vQfZHGsDG0
动态分配内存: 在程序运行中进行的,而不是在编译就确定的
new 堆上分配内存
(1) 开辟T字节大小空间: Tp =new T; size: sizeof(T)
T 是任意类型名,p 是类型为 T 的指针 ,起始地址赋给p
(2) 动态分配任意大小数组: T b = new T[ N ] size: sizeof( N * T) T 是任意类型名,p 是类型为 T* 的指针,N 代表“元素个数”, 可以是任何值为正整数的表达式
delete
(1) delete p
(2) delete []p
- 【问题1】malloc/free和new/delete区别
https://www.cnblogs.com/QG-whz/p/5140930.html
特征 | new/delete | malloc/free |
属性 | 运算符 | 库函数 |
分配内存位置 | 自由存储区为对象动态分配 | 堆上动态开辟 |
分配成功返回值 | 与对象类型相匹配的指针符合(类型安全的操作符) | 返回void*,然后再强制类型转换为需要的类型 |
分配失败返回值 | 抛出异常(bad_alloc) | NULL |
内存分配的大小 |
自动识别 | 手动计算 |
已分配内存的扩充 | 无法直观处理 | realloc |
处理数组 | 有处理数组的new[] | 需要计算数组大小后进行内存分配 |
相互调用 | 可以调用new/delete | / |
分配内存时内存不足 | 指定处理函数/重新制定分配器 | 无法通过用户代码处理 |
函数重载 | 允许 | 不允许 |
构造函数与析构函数 | 调用 | 不调用 |
- 【问题2】 如果用delete p 去释放 int*p=new int[20]
编译没有问题,运行时也一般不会发生错误,但实际上会导致【动态分配的数组没有被完全释放】
- 【问题3】delete后 指针的值是多少?
释放一个指针,并不会使该指针的值变为NULL
- 【问题4】如果new 后,没有及时delete会发生什么?
(1)new完以后没有及时地delete=》导致内存泄露===》即使程序运行解释,这部分内存也没被操作系统收回
(2)如果一直动态分配,却没有释放,可用内存被大量消耗,CPU变慢,重启OK
- 【问题5】为什么要重载new / delete?
(1)出于效率考虑:也许要创建和销毁一个特定的类的非常多的对象以至于这个运算变成了速度的瓶颈。
(2)堆碎片:分配不同大小的内存可能会在堆上产生很多碎片,以至于很快用完内存。虽然内存可能还有,但是由于都是碎片,也就找不到足够大的内存块满足需要。通过为特定类创建自己的内存分配器,可以确保这种情况不会发生。
(3)编译器看到new时,编译器分配内存并调用构造函数,但是当重载new时,可以改变的只是内存分配部分。