【问题标题】:Why doesn't new require a cast to the pointer even though malloc requires it?即使 malloc 需要它,为什么 new 不需要对指针进行强制转换?
【发布时间】:2012-03-07 06:39:27
【问题描述】:

头中new的定义是:

 void* operator new(size_t);

而malloc的定义如前所述:

 void* malloc(size_t);

现在,由于 C++ 是一种强类型语言,它需要程序员进行强制转换才能将 void* 指针转换为程序员需要的类型...在 malloc 中,我们必须执行强制转换,但在 new 中则不需要,虽然两者都返回一个 void* 指针。为什么?

【问题讨论】:

标签: c++ malloc new-operator


【解决方案1】:

因为当您使用new 时,您(通常)使用“新表达式”,它分配和初始化一个对象。然后,您将该对象的地址分配给指向相同(或父)类型的对象的指针,这不需要强制转换。一个普通的新表达式(即不是一个新的位置)将在内部调用operator new,但新表达式的结果只是来自operator new的结果。

如果您直接调用operator new,那么您需要转换其结果以将返回值分配给一个非空指针,就像您必须处理从malloc 的返回一样。

【讨论】:

  • 对@Rohit 链接的问题的接受[和出色:-)] 的答案对此进行了更详细的说明。
【解决方案2】:

因为你对如何使用malloc有错误的印象。它不接收类型作为参数,而只接收类型的大小。

C 和 C++ 是不同的语言。在 C 中,您不需要将 mallocvoid* 强制转换为目标指针类型。在 C++ 中,new 运算符深深地内置在语言中,因此它始终返回与您在参数中给出的类型相对应的值。

规则很简单,C++ 使用new,C 使用malloc,不要混用。

【讨论】:

  • new如何接收类型作为参数??
  • @bhuwansahni, new 是运算符而不是函数。在你使用它的地方,你总是给它分配和构造的对象的类型。建立链接由编译器决定。在 C 中调用 malloc 您只需给出大小。
  • @bhuwansahni,因为没有必要。要编写通用operator new,您需要的目标类型的唯一属性是大小。编译器通过调用类型的适当构造函数来确保类型特定的东西。
  • @bhuwansahni:您混淆了 new 运算符和 operator new。他们是两个不同的东西。 new 运算符是一种用于分配和构造对象的语法。运算符 new 是一种特殊的声明语法,用于声明和编写实现内存分配的函数,连接到 new 运算符。 new int(3) 以与 sizeof(int) 相同的方式知道 int 的大小:它们是操作类型的运算符。 new 运算符计算大小并将其传递给适当的 operator new 函数。
【解决方案3】:

因为operator new调用只是你调用new时在整个链中生成的一个步骤。

当您执行s=new my_type(args); 时,编译器会将其扩展为:

s = (my_type*)my_type.operator new(sizeof(my_type));
s.my_type(args); //Constructor call

【讨论】:

    猜你喜欢
    • 2021-03-19
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-13
    • 2014-04-02
    • 2010-12-10
    相关资源
    最近更新 更多