c ++中的内存管理

时间:2016-05-11 14:00:33

标签: c++ memory

假设我们有两个C ++代码片段:

1:

void fun1()
{
    if(1)
        int a=5;
}

2:

void fun2()
{
    if(1)
        {
            int *b = new int;
            b = 5;
            delete b;
        }
}

他们是等同的吗?在程序离开a块后,为if变量分配的内存是否已释放?如果没有,什么时候被释放?

4 个答案:

答案 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管理的内存。