实际上什么回归类型有新的?

时间:2015-03-17 18:05:24

标签: c++ object constructor malloc new-operator

我阅读了thisthis文章,令我惊讶的是,我发现运算符的返回类型为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 *的警告?

2 个答案:

答案 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流程的“内部机制”的一部分。