3

在 C 中,对调用的结果进行类型转换被认为是糟糕的形式mallocmalloc然而,在 C++中调用的结果似乎应该是类型转换的,即使两者malloc都有new返回类型void*和调用new不是类型转换。为什么在 C++ 中返回的 void 指针new被自动提升而返回的 void 指针malloc不是?

4

2 回答 2

14

operator newnew运营商感到困惑。operator new只是分配原始内存并返回 a void*,而new T在分配后也调用构造函数并返回 a T*

此外,您必须malloc在 C++ 中转换结果,因为与 C 不同,C++ 不允许从隐式转换void*到其他指针类型。请注意,这void*在 C++ 中很少使用。

于 2013-02-16T13:24:44.460 回答
4

在 C++ 中,内存位置确实是通过 void 指针表示的。但是内存与对象不同。一个对象需要内存才能生存,但该对象不同于它所在的内存。

您需要在内存中创建一个对象。如果你愿意,new-operator 在内存和对象之间“转换”:

#include <cstdlib>

void * pm = std::malloc(sizeof(int));       // C-style
void * qm = ::operator new(sizeof(int));    // C++-style

int * po = ::new (pm) int(10);              // void pointer goes in...
int * qo = ::new (qm) int(20);              // ...object pointer comes out.

// (... class-type objects would need to be destroyed...)

std::free(pm);
::operator delete(qm);
于 2013-02-16T13:46:19.180 回答