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

bhu*_*hni 11 c++ malloc new-operator

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

 void* operator new(size_t);
Run Code Online (Sandbox Code Playgroud)

malloc的定义如下:

 void* malloc(size_t);
Run Code Online (Sandbox Code Playgroud)

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

Jer*_*fin 12

因为当你使用时new,你(通常)使用"新表达式",它分配和初始化一个对象.然后,您将该对象的地址分配给指向同一(或父)类型的对象的指针,该对象不需要强制转换.一个正常的新的表达(即,不是放置新)将调用operator new内部但新的表达式的结果是只是从结果operator new.

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

  • @Rohit所关联的问题的答案[和辉煌的:-)]回答了更详细的问题. (2认同)

Jen*_*edt 5

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

C和C++是不同的语言.在C你没有需要转换void*malloc到目标指针类型.在C++中,new运算符深入构建到语言中,使得它总是返回与您在参数中给出的类型相对应的值.

该规则非常简单地new用于C++和mallocC,不要混用它们.