假设我们有两个C ++代码片段:
1:
void fun1()
{
if(1)
int a=5;
}
2:
void fun2()
{
if(1)
{
int *b = new int;
b = 5;
delete b;
}
}
他们是等同的吗?在程序离开a
块后,为if
变量分配的内存是否已释放?如果没有,什么时候被释放?
答案 0 :(得分:0)
它们并不等同。在fun1
a
中,可能是寄存器,也可能是堆栈上的位置,具体取决于编译器优化。无论哪种方式,它都会在if"块之后超出范围。"在fun2
中,您的存储将在堆上。一般而言,对于小型和短期对象,fun1
将远远超过fun2
。
答案 1 :(得分:0)
当函数完成时,“a”和“b”都将从内存中释放。 'a'将被取消分配,因为它留下了范围,'b'将被释放,因为你明确地调用了删除。
它们在记忆方面不相同。在fun1()中,您可以为堆栈分配一个int。在fun2()中,在堆栈上分配一个int指针,在堆中分配一个int。这意味着fun2()稍慢并且使用更多内存。
答案 2 :(得分:0)
假设第二个函数中有拼写错误。
他们是等同的吗?
第一个函数几乎不会执行任何操作,同时第二个函数将调用可能重载的运算符new
和也可能重载的运算符delete
。这将分配动态内存并最终释放它。
更重要的是,第二个函数可以抛出异常。
在程序离开if块后,是否释放了为变量分配的内存?
在第一个函数中,如果已分配范围,则在离开范围后将释放内存。在第二个示例中,在执行delete
运算符后将释放内存,但请记住,您有一个指针作为局部变量,它将在第一种情况下执行。
答案 3 :(得分:0)
{ ... }
称为复合语句。如果在if
语句中省略了大括号,则所附的语句仍然是复合语句。复合语句具有块范围。这意味着在块范围结束时销毁自动存储的变量。
void fun1()
{
if(1)
int a=5; // a destroyed at semi-colon
}
void fun2()
{
if(1)
{
int *b = new int;
b = 5;
delete b;
} // b destroyed at brace
}
使用new int
分配的内存的生命周期与b
的存储持续时间无关。这是推荐使用智能指针的原因之一,因此您不必担心会破坏由b
管理的内存。