我阅读了this和this文章,令我惊讶的是,我发现运算符的返回类型为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 *的警告?
答案 0 :(得分:4)
new-expression的类型是指向正在创建的类型的指针。因此new int
的类型为int*
。
operator new
是一个由new-expression调用的函数,用于分配内存以存储它正在创建的对象。它返回void*
,因为该内存中还没有任何对象。然后new-expression在该内存中创建一个或多个对象,然后生成一个指向这些对象的正确类型的指针。
operator new
(以及相应的operator delete
)来分配原始内存。例如,标准库容器使用的默认分配器std::allocator
就是这样做的。
答案 1 :(得分:1)
您错误地将包含关键字new
的表达式误认为是operator new
的调用。
operator new
返回void*
与new
- 表达式的评估无关!
将operator new
视为整个new
流程的“内部机制”的一部分。