所以这个语句分配内存但不调用MyClass的constructur
MyClass *ptr = (MyClass*)::operator new (sizeof(MyClass));
为什么(MyClass*)
必须被投射,或者这不是正在发生的事情?
答案 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中使用强制转换,但malloc
和operator new
需要在C ++中使用强制转换。
在这种特殊情况下,强制转换实际上是static_cast
,因为从void*
到指针对象的转换与标准转换相反。 1}}优先于C风格的演员,因为它更明确。
答案 2 :(得分:5)
函数::operator new()
的返回类型为void *
。
在C ++中,没有从void *
到其他指针类型的隐式转换,需要强制转换。它类似于在C ++中尝试使用malloc
。
事实上,::operator new
的合理实施只是return malloc(sz);