为什么new不需要对指针进行强制转换,即使malloc需要它?

时间:2012-03-07 06:39:27

标签: c++ malloc new-operator

< new>中new的定义标题是:

 void* operator new(size_t);

malloc的定义如下:

 void* malloc(size_t);

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

3 个答案:

答案 0 :(得分:12)

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

如果直接调用operator new,则需要转换结果以将返回值分配给非void指针,就像从malloc返回一样。

答案 1 :(得分:5)

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

C和C ++是不同的语言。在C中,您不需要将void*的{​​{1}}强制转换为目标指针类型。在C ++中,malloc运算符深深地构建到语言中,因此它总是返回与您在参数中给出的类型相对应的值。

规则很简单,对于C ++使用new,对C使用new,不要混用它们。

答案 2 :(得分:1)

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

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

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