有人可以帮我解决这个问题吗?
不删除下面第(*)行分配的内存。
void f() {
int z = *new int; // (*)
//...
}
不改变行上的代码(*),有什么方法可以避免内存泄漏?如果是这样,怎么样?如果没有,为什么不呢?
我不明白的是,*new int
是什么意思?具体来说,添加*
除了新意味着什么呢?
另外,如果不是int z,我们有int &z
?
答案 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() );