实际上什么返回类型有一个新的



我读了这篇文章和这篇文章,令我惊讶的是,我发现运算符有一个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过程的"内在机制"的一部分。

相关内容

最新更新