为什么运算符新函数需要转换

时间:2014-09-08 04:51:17

标签: c++ new-operator

所以这个语句分配内存但不调用MyClass的constructur

  MyClass *ptr = (MyClass*)::operator new (sizeof(MyClass));

为什么(MyClass*)必须被投射,或者这不是正在发生的事情?

3 个答案:

答案 0 :(得分:8)

Matt McNabb和Brian Bi说,但这也是For Your Own Good™。您不应该转换指针,但应将其保持为void*。这样,如果不首先构建它(通过使用展示位置new),您不会意外地将其用作目标类型。如,

void* p = ::operator new(sizeof (MyClass));
MyClass* pmc = new (p) MyClass;

答案 1 :(得分:6)

根据N3936,§3.7.4.1/ 1:

  

分配函数应该是类成员函数或全局函数;如果一个程序是不正确的   分配函数在全局范围以外的命名空间范围内声明,或在全局范围内声明为static   范围。返回类型应为void*

这是有道理的,因为::operator new不知道它用于分配的类型;它只知道大小。所以它必须返回void*,因为它还能返回什么?

在C ++中(与C不同),没有从void*到指针到对象的隐式转换。这就是为什么malloc不需要在C中使用强制转换,但mallocoperator new需要在C ++中使用强制转换。

在这种特殊情况下,强制转换实际上是static_cast,因为从void*到指针对象的转换与标准转换相反。

答案 2 :(得分:5)

函数::operator new()的返回类型为void *

在C ++中,没有从void *到其他指针类型的隐式转换,需要强制转换。它类似于在C ++中尝试使用malloc

事实上,::operator new的合理实施只是return malloc(sz);