c++中的内存管理

Memory managment in c++

本文关键字:管理 内存 c++      更新时间:2023-10-16

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

1:

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

2:

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

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

当函数完成时,'a'和'b'都将从内存中释放。'"a"将被解除分配,因为它离开了作用域,"b"将被取消分配,因为您显式调用了delete。

就记忆力而言,它们并不等同。在fun1()中,您为堆栈分配一个int。在fun2()中,您在堆栈上分配一个int指针,在堆中分配一个整型指针。这意味着fun2()稍微慢一点,占用更多内存。

它们不等价。在fun1中,a可能是一个寄存器,也可能是堆栈上的一个位置,具体取决于编译器的优化。无论哪种方式,它都会在if"块"之后超出范围。在fun2中,您的存储将在堆上。一般来说,对于小型和短命的对象,fun1将远远优于fun2

假设您在第二个函数中有一个拼写错误。

它们等效吗?

第一个函数几乎什么都不做,同时第二个函数将调用可能过载的运算符new和也可能过载的操作符delete。这将分配动态内存并最终释放它。更重要的是,第二个函数可以抛出异常。

分配给变量的内存是否在程序离开if块后释放?

在第一个函数中,如果分配了内存,则在离开作用域后将释放内存。在第二个示例中,执行delete运算符后将释放内存,但请记住,您有一个指针作为局部变量,其执行方式与第一种情况类似。

{ ... }被称为复合语句。如果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管理的内存。