1

可能重复:
new/delete 和 malloc/free 有什么区别?

它们在功能上是否等效,并且是调用 delete 时需要使用 [] 运算符的唯一区别,还是我还缺少其他东西?

谢谢

4

5 回答 5

4

正如 Mehrdad 在这个问题中所说:

malloc 分配未初始化的内存。分配的内存必须免费释放。

new 通过调用构造函数初始化分配的内存(如果它是一个对象)。用 new 分配的内存应该用 delete 释放(这反过来又调用析构函数)。它不需要您手动指定所需的大小并将其转换为适当的类型。因此,它更现代,更不容易出错。

注意:- new 是一个运算符, malloc 是一个函数

于 2012-10-19T20:33:07.613 回答
1

有几个不同之处。

首先,new int[5]必须使用 释放delete[],并且malloc(...)必须使用 释放free。你不能混搭。

其次,如果您使用带有构造函数的类型,则malloc不会调用构造函数,free也不会调用析构函数。您必须手动调用它们(或仅使用new/ free)。

于 2012-10-19T20:33:50.387 回答
1

new 运算符在失败的情况下调用 new_handler 并可能引发 std::bad_alloc 异常。malloc() 不做这些事情。

于 2012-10-19T20:33:58.387 回答
0

new有类型安全,malloc没有。

new调用构造函数,malloc没有。

delete调用析构函数,free()没有。

于 2012-10-19T20:35:01.230 回答
0

运算符 new 和 new[]。

为了请求动态内存,它存在操作符 new。new 后跟数据类型和可选的括号 [] 中所需的元素数。它返回一个指向新分配内存块开始的指针。

它的形式是:pointer = new type orpointer = new type [elements] 第一个表达式用于分配内存以包含一个类型的单个元素。第二个用于分配类型元素的块(数组)。例如:

诠释*鲍比;

鲍比 = 新的 int [5];

在这种情况下,操作系统在堆中为 5 个 int 类型的元素分配了空间,并返回了一个指向其开头的指针,该指针已分配给 bobby。因此,现在,bobby 指向一个有效的内存块,其中有 5 个 int 元素的空间。

函数malloc。

将动态内存分配给指针是通用函数。它的原型是:void * malloc(size_t nbytes);其中 nbytes 是我们希望分配给指针的字节数。该函数返回一个 void* 类型的指针,我们必须将值类型转换为目标指针的类型,例如:

字符 * 罗尼;

ronny = (char *) malloc (10);

这为 ronny 分配了一个指向 10 字节的可用块的指针。当我们想要分配除 char 以外的不同类型的数据块(不同于 1 个字节)时,我们必须将所需的元素数量乘以每个元素的大小。幸运的是,我们有操作符 sizeof,它返回具体数据的数据类型的大小。

诠释*鲍比;

bobby = (int *) malloc (5 * sizeof(int));

这段代码为 bobby 分配了一个指向 int 类型的 5 个整数块的指针,根据编译程序的系统,这个大小可以等于 2、4 或更多字节。

于 2012-10-19T20:39:13.260 回答