什么是new?
- c++通过new关键字进行动态分配内存。
- new开辟的空间存储在堆上,而我们定义的变量存储在栈上。
- new分配的空间使用delete释放,new[] 使用 delete[]
- new创建对象必须使用指针接收
new的缺点
- 使用new分配对象要贵得多。
- 速度较慢。
- 内存泄漏
- 内存碎片
new和malloc的区别
- malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。
- 对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。 由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。
- new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换;malloc内存分配成功则是返回void * ,需要通过强制类型转换将void*指针转换成我们需要的类型。
- new内存分配失败时,会抛出bac_alloc异常,它不会返回NULL;malloc分配内存失败时返回NULL。
- 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算;malloc则需要显式地指出所需内存的尺寸
何时使用new
- 函数返回局部变量,这个变量必须是new出来的,返回该指针
- 创建对象使用大内存时
释放一个指针,并不会使该指针的值变为 NULL
- 需要手动显示NULL,否则很危险
内存泄露问题解决
- 用完必须delete
- 建议使用智能指针