new 与 delete 运算符在C++中用于动态分配内存。而在C语言中C库函数malloc 与 free 也可以用作动态分配内存。
malloc 与 free 使用实例:
void *malloc(size_t size)
/* malloc 与 free 使用 */
int* p = (int*)malloc(sizeof(int));
if (nullptr == p)
{
cerr << "malloc error" << endl;
return -1;
}
*p = 20; // 赋值
free(p); // 销毁
new 与 delete 使用实例:
/* new 与 delete 使用 */
int* q = new int(20); // 申请+赋值
delete q;
/* 异常判断 通过捕获异常*/
try
{
int* q1 = new int(20); // 申请失败默认抛出异常
// ..
delete q1;
}
catch (const bad_alloc & e)
{
cerr << e.what() << endl;
return -1;
}
/* 异常判断 通过判断返回值*/
int* q2 = new(std::nothrow) int(20); // 不抛出异常
if (nullptr == q2)
{
cerr << "new error" << endl;
return -1;
}
delete q2;
1. 区别与联系
- new 可以在开辟内存的同时做初始化;malloc只能先开辟空间 后初始化。
- new 开辟内存失败,默认是通过抛出bad_allocd类型的异常来判断; malloc开辟内存失败,通过返回值等于nullptr做判断。
- new 申请的数组在使用delete释放时,使用
delete[] parr;
语法;malloc申请的空间,使用free(p);
的方式释放。
注:free
Free函数释放以前通过调用calloc、 malloc或realloc分配的内存块(memblock)。 释放的字节数等于分配块时请求的字节数(如果realloc,则为重新分配的字节数)。 如果memblock为NULL,则将忽略指针,并且立即返回free 。 尝试释放无效指针(指向不是由calloc、 malloc或realloc分配的内存块的指针)可能会影响后续分配请求并导致错误。
注:delete
在指向未分配new的对象的指针上使用delete会产生不可预测的结果。但是,您可以在值为0的指针上使用delete。这一规定意味着,当new失败时返回0,删除失败的new操作的结果是无害的。
- free 与 delete 都可以对NULL指针使用,同时不会产生任何效果。
- free 与 delete 使用之后不会改变指针的指向,一般在使用之后手动将指针置空。
2. new有多少种
int* p1 = new int(10); // 普通的new操作:默认抛出异常
int* p2 = new(nothrow) int(20); // 不抛出异常的new操作
const int* p3 = new const int(30); // 在堆区申请常量内存
// 定位new : 在指定位置申请空间
int data = 0;
int* p4 = new(&data) int(40); // 在 (&data) 上申请空间,初始为40