【问题标题】:what is return type of new in c++?c++中new的返回类型是什么?
【发布时间】:2011-02-11 11:27:37
【问题描述】:

在 C 中,malloc() 返回 void*。但是在 C++ 中,new 返回什么?

double d = new int;

【问题讨论】:

  • @Suma:虽然我基本上同意你对 kam 问题的看法,但我相信这是真实的,并且是 new 表达new 之间的重要区别在谷歌上搜索“operator new”时很难找到 operator
  • @Suma:一个糟糕的问题仍然可以带来好的答案。
  • 这里有一点语义错误。由于new 是语言关键字而不是函数,因此它不会“返回”任何内容。这个问题有点像问1 返回什么或+ 返回什么?这得看情况。正确的问题是询问涉及它的表达式的规则是什么。

标签: c++


【解决方案1】:

您必须区分两件事。一种是新的表达方式。它是表达式new T,其结果是T*。它做了两件事:首先,它调用 new 运算符分配内存,然后它为 T 调用 构造函数。(如果构造函数中止除了一个例外,它还会调用 delete 运算符。)

然而,前面提到的 new 运算符 有多种形式。最突出的是这个:

void* operator new(std::size_t);

您可以显式调用它,但很少这样做。

new 运算符还有其他形式,例如用于数组

void* operator new[](std::size_t);

或所谓的placement new(实际上是一个fake-new,因为它不分配):

void* operator new(void*, std::size_t);

【讨论】:

  • 一个愚蠢问题的好答案。发帖人似乎不知道“新”如何融入语言。答案很好地解释了这一点。
  • @kam: <sigh> 再读一遍。 new int 是一个新表达式。该语言定义它返回一个int*。除其他外,它还调用 new 运算符,是的,它返回 void*,因为它只分配原始存储。构造函数(int 为空)将原始存储转换为初始化对象。如果您愿意,可以将其视为从void*int* 的转换。
  • 但是,new T 不会评估为数组的 T*
  • @sbi,如果T是数组类型,那么new TT*不兼容。这就是我想说的:) 这不取决于你是否写括号。这取决于类型。 (假设T 可以是数组类型的 typedef 或传递数组类型的模板参数)。因此,在模板中 T * t = new T; 不适用于数组。
  • 哎哟。实际上,T 可以是数组的typedef。我永远不会想到这一点。好吧,考虑到这个问题,我仍然认为我们可以跳过这个细节,但我对你对细节的关注感到惊讶。
【解决方案2】:

new Type[x]new Type 返回的值类型为Type *。您的示例 double d = new int 包含两个错误:

  • 你需要将结果赋值给一个指针,像这样:double *d = new int
  • 指针必须是指向 Type 的指针或可以使用隐式转换将指向 Type 的指针转换为的指针:int *d = new intvoid *d = new int

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-19
    • 2014-11-06
    • 2012-05-29
    • 2015-02-08
    • 2018-04-04
    • 2018-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多