* new int是什么意思?

时间:2014-06-26 15:32:20

标签: c++ pointers reference

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

不删除下面第(*)行分配的内存。

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

不改变行上的代码(*),有什么方法可以避免内存泄漏?如果是这样,怎么样?如果没有,为什么不呢?

我不明白的是,*new int是什么意思?具体来说,添加*除了新意味着什么呢?

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

4 个答案:

答案 0 :(得分:6)

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

return;
// your silly * line here

答案 1 :(得分:5)

  

不改变行上的代码(*),有什么方法可以避免泄漏内存?

在现实生活中,你绝对会改变这条线 - 它是疯了。

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

  • 在它之前添加return;,因此new永远不会发生;
  • 覆盖::operator new以返回可通过其他方式访问的指针,例如全局变量。
  

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

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

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

  

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

z将是动态对象的引用,而不是副本。然后可以使用delete &z修复泄漏。这将是一个单一的,令人困惑的事情;不要用实际代码来做。

通常,避免动态分配,并在必要时使用RAII类型管理动态资源,如容器和智能指针。原始指针容易出错,特别是在抛出异常时;其他任何东西都是疯狂的秘诀。

答案 2 :(得分:2)

不,没有办法不用该代码泄漏内存,因为new返回的指针丢失了。

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

答案 3 :(得分:2)

理解这一陈述

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

逻辑上拆分它会很有用。

首先有一个名为operator

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() );
相关问题