【问题标题】:What does *new int mean?*new int 是什么意思?
【发布时间】:2014-06-26 15:32:20
【问题描述】:

有人可以帮我解答这个问题吗?

在下面的 (*) 行分配的内存不会被删除。

void f() {
    int z = *new int; // (*)
    //...
}

在不修改(*)行代码的情况下,有什么办法可以避免内存泄露?如果是这样,怎么做?如果没有,为什么不呢?

我不明白的是,*new int 是什么意思?具体来说,在new旁边加上*是什么意思?

另外,如果我们有 int &z 而不是 int z 呢?

【问题讨论】:

  • 这意味着某人正在做一些非常愚蠢的事情。如果你使用了int &z,那么你可以使用delete &z,但这是非常不习惯的代码,会引起很多人的注意。
  • 这是一个面试题吗?
  • @Simple: 可以作为一种解决方法来避免函数体中的指针取消引用。
  • *new 是 内存泄漏操作符。不要使用它。
  • @Werner。这是一个古老的考试题

标签: c++ pointers reference


【解决方案1】:

那行是内存泄漏。在保存它的句柄(由new 返回的地址)之前,在堆上分配一个int int 并取消对它的引用(使用*)也是没有意义的。因此,避免泄漏的唯一可能方法是:

return;
// your silly * line here

【讨论】:

    【解决方案2】:

    在不改行(*)代码的情况下,有什么办法可以避免内存泄露?

    在现实生活中,你绝对会改变那条线——这太疯狂了。

    假设这是一个智力练习,那么可能性是:

    • 在其前面添加return;,这样new 就不会出现;
    • 重写 ::operator new 以返回一个指针,您可以通过其他方式访问该指针,例如全局变量。

    我不明白的是,*new int 是什么意思?

    new int 动态分配int 类型的对象,并给出指向它的指针。 * 取消引用该指针,以便可以复制对象以初始化 z。指针不存储在任何地方,因此之后无法访问或删除动态对象。

    此外,z 从未初始化对象的值初始化会产生未定义的行为。

    另外,如果我们用int &z 代替int z 会怎样?

    z 将是对动态对象的引用,而不是其副本。然后可以使用delete &z 修复泄漏。那将是一件单调的、令人困惑的事情。不要在实际代码中这样做。

    一般来说,避免动态分配,并在必要时使用 RAII 类型管理动态资源,例如容器和智能指针。原始指针容易出错,特别是在抛出异常时;其他任何事情都会导致精神错乱。

    【讨论】:

      【解决方案3】:

      那要明白这个说法

      int z = *new int; // (*)
      

      按逻辑拆分会很有用。

      一开始叫算子

      new int
      

      考虑到这个调用分配的内存不会被初始化。

      语句执行的结果是一些指向 int 的临时指针,即 int * 让我们将其命名为p。

      在下一步中,这个临时指针被取消引用

      *p
      

      这个表达式返回分配的内存中的一些垃圾。

      这些垃圾被分配给变量z。

      所以代码没有任何意义。

      至少写成这样会更好

      int z = *new int( 10 );
      

      或

      int z = *new int();
      

      或

      int z = *new int {};
      

      初始化变量z

      无论如何都会有内存泄漏。

      我看到避免内存泄漏的唯一方法是写

      int z = *std::unique_ptr<int>( new int() );
      

      【讨论】:

        【解决方案4】:

        不,由于new 返回的指针丢失了,因此无法使用该代码不泄漏内存。

        *new int 表示“为int 分配内存,生成指向该内存的指针,然后取消引用该指针,生成(未初始化的)int 本身”。我认为这是未定义的行为。

        【讨论】:

        • @Deduplicator 通过不做麻烦的事情,是的,当然......我认为这等同于“没有办法使用该代码泄漏内存”。我会澄清的。
        • 如果它是一个未初始化的自动变量,没有人获取过它的地址,或者int 的实现定义表示允许陷阱表示,它可能是 UB。见:stackoverflow.com/questions/22839466/…
        猜你喜欢
        • 2012-12-18
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 2015-08-28
        • 2011-06-05
        • 2011-07-12
        • 2015-03-21
        • 2016-09-06
        相关资源
        最近更新 更多