📜  C++中的new vs malloc()和free()vs delete(1)

📅  最后修改于: 2023-12-03 15:14:02.640000             🧑  作者: Mango

C++ 中的 new vs malloc() 和 free() vs delete

在 C++ 中,动态分配和释放内存很常见,而 new/malloc() 和 delete/free() 是两组常用的操作。本文将深入探讨它们的差异和使用场景。

new 和 malloc()
new

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()

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 vs malloc() 对比

下表列出了 newmalloc() 的主要区别:

| 特性 | new | malloc() | | :----: | :-----: | :------: | | 针对类型 | Yes | No | | 返回类型 | 指针 | void* | | 重载运算符 | Yes | No | | 抛出异常 | Yes | No | | 初始化 | 构造函数 | No |

delete 和 free()
delete

删除由 new 分配的动态内存需要使用 delete 运算符。对于数组,应使用 delete[]。语法如下:

delete ptr;       // 删除单个对象
delete[] ptr;     // 删除对象数组

例如,以下代码删除了上面示例中分配的内存:

delete p1;
delete[] p2;

将已经销毁(或 nullptr)的指针传递给 delete,或多次调用 delete 都会引起未定义的行为。此外,当 delete 删除非指向动态分配内存的指针时,也会引起未定义的行为。

free()

malloc() 分配的内存需要使用 free() 函数释放。语法如下:

free(ptr);

例如,以下代码释放了上面示例中分配的内存:

free(p1);
free(p2);

必须传递给 free() 一个通过 malloc() 分配的指针,否则会引起未定义的行为。

delete vs free() 对比

下表列出了 deletefree() 的主要区别:

| 特性 | delete | free() | | :----: | :-----: | :----: | | 针对类型 | Yes | No | | 重载运算符 | Yes | No | | 销毁对象 | 析构函数 | No |

综合对比

综合来看,new/delete 对于对象的分配和释放更加方便。而 malloc()/free() 更加灵活,适用于需要动态管理内存的场景。但由于 new/delete 常常与构造函数和析构函数一起使用,能够使得代码更加高效,安全和可读性更高。

总结

本文介绍了 new/malloc()delete/free() 之间的重要差异,以及它们在 C ++ 中的使用情况,包括语法,错误和注意事项。C ++ 中大多数情况下都使用 new/delete,只有在特殊情况下使用 malloc()/free()