我读了这篇文章和这篇文章,令我惊讶的是,我发现运算符有一个void*
返回类型。
void* operator new (size_t size)
{
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
但另一方面,我们知道,new 返回一个对象而不是 void 指针。怎么可能?
好的,让我们对上面的代码进行一些更改
void* _new (size_t size)
{
void *p=malloc(size);
if (p==0) // did malloc succeed?
throw std::bad_alloc(); // ANSI/ISO compliant behavior
return p;
}
现在,编译器是否会阻止与其他类型的 void* 相关的警告?
新表达式的类型是指向正在创建的类型的指针。所以new int
的类型是int*
.
operator new
是由 new-expression 调用的函数,用于分配内存以存储它正在创建的对象。它返回void*
因为该内存中尚无任何对象。然后,new-expression 在该内存中创建一个或多个对象,然后再生成指向这些对象的正确类型的指针。
operator new
(和相应的operator delete
)也可以直接调用来分配原始内存。例如,标准库容器使用的默认分配器std::allocator
执行此操作。
您误会将包含关键字 new
的表达式误认为是 operator new
的调用。
operator new
返回void*
与new
表达式的计算结果无关!
考虑operator new
成为整个new
过程的"内在机制"的一部分。