指针真正的用武之地在于,在运行阶段分配未命名的内存以存储值。
——C++ Primer Plus
malloc与new实现了程序在运行时动态分配内存,分配的内存块位于堆(heap)或自由存储区。
malloc与new的区别
- malloc是C/C++的库函数,与库函数free配对使用,而new是C++中的运算符,可以被重载,与delete配对使用。一个是库函数,一个是运算符。
- malloc使用方式为:void*malloc(unsigned int num_bytes),分配num_bytes字节大小的内存,返回类型为void*,即未确定类型的指针,即分配了内存,但不知道这段内存到底会被用来存什么类型的数据,一般会采用强制类型转换如int* p=(int*)malloc(10*sizeof(int));free(a); 采用new运算符时,无需指定内存大小,编译器会自动计算应该分配多大的内存,返回类型为完整类型指针,即返回类型与对 象完全匹配,如果申请空间失败则会返回nullptr,而malloc返回失败返回0。
- new是运算符,可以被重载;malloc与free虽然是函数,但不能被重载。
- malloc分配的内存块,如果在使用过程中发现内存不足,可以采用realloc重新分配;而new运算符没有这样的扩展内存的机制
- new与delete可以基于malloc与free实现;反之不成立。
new与delete使用时的注意事项:
- new 与delete要配对使用,不然会发生内存泄漏。
- delete是释放指针所指向的内存,而不会删除指针变量本身。
- new和delete可以实现在一个函数中分配的内存,而在另一个函数中释放。
- 在使用这种指针指向的数组时,只需把指针当做数组名就可以了。
- 不要尝试释放已经释放的内存块;对空指针使用delete是安全的
- 用new分配的动态数组,应用delete []来释放
- new分配的内存块是从堆(heap)或自由存储区的内存区域分配,而常规变量分配的内存块在被称作栈(stack)的内存区域中