【问题标题】:Actually what return type has a new?实际上什么返回类型有新的?
【发布时间】:2015-05-20 07:44:54
【问题描述】:

我阅读了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* 有关的警告吗?

【问题讨论】:

  • 返回对象时“新”签名会是什么样子?
  • 这些是自定义实现,可能是错误的?
  • @πάνταῥεῖ 是的。但是在这种情况下,您不能编写函数签名来返回指向任何类型的类的指针。所以这就是为什么使用 void* 并且转换是由编译器在没有警告的情况下完成的。
  • 您将包含关键字new 的表达式误认为是operator new 的调用。
  • 新表达式具有特殊的语义。提供类型时,即返回指针的类型(尽管对于全局 operator new,返回类型为 void*)。

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


【解决方案1】:

new-expression 的类型是指向正在创建的类型的指针。所以new int的类型是int*

operator new 是一个由 new 表达式调用的函数,用于分配内存来存储它正在创建的对象。它返回void*,因为该内存中还没有任何对象。然后 new 表达式在该内存中创建一个或多个对象,然后生成指向这些对象的正确类型的指针。

operator new(以及对应的operator delete)也可以直接调用来分配原始内存。例如,标准库的容器使用的默认分配器std::allocator 就是这样做的。

【讨论】:

  • 那么将 void* 转换为自定义对象类型呢?
  • @user2846015:我不知道这有什么关系。 new-expression 将执行该转换,以便为您提供正确键入的指针。如果你直接调用operator new(不是通过新表达式),那里没有对象,只有原始内存,所以你不应该强制转换它。
  • 我认为如果我们还涵盖了展示位置new,这个对话会变得更加混乱。
  • @Yakk:是的,所以我没有。
【解决方案2】:

您将包含关键字 new 的表达式误认为是对 operator new 的调用。

operator new 返回 void*new-表达式的计算结果无关!

operator new 视为整个newing 流程的“内部机制”的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 2021-03-11
    • 2021-02-03
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多