📅  最后修改于: 2023-12-03 15:14:02.640000             🧑  作者: Mango
在 C++ 中,动态分配和释放内存很常见,而 new/malloc() 和 delete/free() 是两组常用的操作。本文将深入探讨它们的差异和使用场景。
new
是 C++ 中的运算符,用于在堆上动态分配内存。它是基于类型进行分配的,返回指向分配的内存的指针。语法如下:
new type;
new type[n]; // n 为元素个数
例如,以下代码分别分配了一个 int
和一个 int
数组:
int* p1 = new int;
int* p2 = new int[10]; // 分配 10 个 int
当 new
调用成功时,它将返回指向分配内存空间的指针,否则将抛出 std::bad_alloc
异常。
malloc()
是 C 语言中的函数,用于在堆上动态分配内存。它并不基于类型进行分配,而是通过指定字节数来分配。malloc()
返回一个指向分配的内存的指针。语法如下:
void* malloc(size_t size);
例如,以下代码分别分配了一个 int
和一个 int
数组:
int* p1 = (int*)malloc(sizeof(int));
int* p2 = (int*)malloc(sizeof(int)*10); // 分配 10 个 int
当 malloc()
调用成功时,它将返回指向分配内存空间的指针,否则将返回 NULL
。
下表列出了 new
和 malloc()
的主要区别:
| 特性 | new | malloc() | | :----: | :-----: | :------: | | 针对类型 | Yes | No | | 返回类型 | 指针 | void* | | 重载运算符 | Yes | No | | 抛出异常 | Yes | No | | 初始化 | 构造函数 | No |
删除由 new
分配的动态内存需要使用 delete
运算符。对于数组,应使用 delete[]
。语法如下:
delete ptr; // 删除单个对象
delete[] ptr; // 删除对象数组
例如,以下代码删除了上面示例中分配的内存:
delete p1;
delete[] p2;
将已经销毁(或 nullptr
)的指针传递给 delete
,或多次调用 delete
都会引起未定义的行为。此外,当 delete
删除非指向动态分配内存的指针时,也会引起未定义的行为。
malloc()
分配的内存需要使用 free()
函数释放。语法如下:
free(ptr);
例如,以下代码释放了上面示例中分配的内存:
free(p1);
free(p2);
必须传递给 free()
一个通过 malloc()
分配的指针,否则会引起未定义的行为。
下表列出了 delete
和 free()
的主要区别:
| 特性 | delete | free() | | :----: | :-----: | :----: | | 针对类型 | Yes | No | | 重载运算符 | Yes | No | | 销毁对象 | 析构函数 | No |
综合来看,new/delete
对于对象的分配和释放更加方便。而 malloc()/free()
更加灵活,适用于需要动态管理内存的场景。但由于 new/delete
常常与构造函数和析构函数一起使用,能够使得代码更加高效,安全和可读性更高。
本文介绍了 new/malloc()
和 delete/free()
之间的重要差异,以及它们在 C ++ 中的使用情况,包括语法,错误和注意事项。C ++ 中大多数情况下都使用 new/delete
,只有在特殊情况下使用 malloc()/free()
。