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

rog*_*hat 0 c++ new-operator

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

  MyClass *ptr = (MyClass*)::operator new (sizeof(MyClass));
Run Code Online (Sandbox Code Playgroud)

为什么(MyClass*)要投,或者不是这里发生的事情?

Chr*_*ung 8

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

void* p = ::operator new(sizeof (MyClass));
MyClass* pmc = new (p) MyClass;
Run Code Online (Sandbox Code Playgroud)


Bri*_*ian 6

根据N3936,§3.7.4.1/ 1:

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

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

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

在这种特殊情况下,强制static_cast转换实际上是一个,因为从void*指针到对象的转换与标准转换相反.喜欢static_castC风格的演员,因为它更明确.


M.M*_*M.M 5

该函数::operator new()具有返回类型void *.

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

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