【问题标题】:Why does new keyword return pointer instead of reference?为什么 new 关键字返回指针而不是引用?
【发布时间】:2015-07-05 03:28:16
【问题描述】:

我知道new 关键字返回指针,所以返回类型是void*。我愚蠢的问题是,为什么 new 必须返回 void* 而不是 void& ?意味着当new创建对象时,他们可以使用&操作符的地址返回该对象的地址。

我知道指针和引用之间的区别。但最后我们使用指针而不是引用。请解开我的困惑谢谢。

【问题讨论】:

  • 如果new 返回void *,那么int *p = new int; 将无法编译。这假设您指的是语言 new 而不是 <new> 中的内容。
  • 因为引用不是含糖的指针,它们是别名。
  • 请在此处阅读 operator new 和 new operator 之间的区别stackoverflow.com/questions/16345340/does-new-return-void-in-c
  • 不是一个答案,因为我没有任何好的证据,但我对它为什么是指针而不是引用的理解是:1) C++ 在首次创建时没有异常。因此,如果您未能分配内存,则表明失败的方式是返回 null。你不能用引用来做到这一点。 2) 顺便说一句,C++ 在首次创建时也没有引用,所以无论如何也不可能。 3) 即使有异常和引用,仍然有new 的重载明确无异常,在这些情况下使用null 表示失败。
  • 为了向后兼容。他们一直在改进 C++,但没有改变它。旧代码应该可以工作。此外,您可以使用new 创建的内容delete,但是您将引用一个不存在的对象,这是非法的。

标签: c++ pointers


【解决方案1】:

New 返回用于在内存中分配空间的任何类型的指针,而不是 void*

 auto p1 = new int[5];   // returns a pointer to an int pointing to the 1st element
 auto p2 = new short[5]; // returns a pointer to a short pointing to the 1st element

引用只能赋值一次,裸指针可以赋值多次。您可以删除内存并分配更多内存并将其分配给相同的指针。这是主要区别。

delete[] p1;
p1 = new int[20]; 

【讨论】:

  • 这个是怎么回事.. ClassName *obj=&obj2; 假设 obj2 使用 new 关键字创建并分配给 *obj 所以。为什么 new 没有返回 &obj2 ?这可能有问题?
【解决方案2】:

我相信new 返回一个指针,因为它比引用更灵活,而且我认为它与旧 C++ 和 C 代码的向后兼容性有很大关系,其中 NULL 用于指示分配失败。而设置对 null 的非 const 引用是无效的。

此外,new 无法命名它分配的对象,而是返回一个指向它分配的对象的指针。您不能将非 const 左值引用绑定到未命名的对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-13
    • 2011-05-24
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多