c++ - 为什么 c++ 变量没有立即删除?

标签 c++ pointers garbage

<分区>

我想知道为什么当您从函数返回时指向的数据没有立即删除。在下面的代码片段中,我希望当我将 x 的地址返回到函数返回时初始化它的指针时,应该立即删除存储在 x 地址中的数据。但是我仍然能够在 main 中获得正确的值,然后仅在多一行代码之后它突然变成垃圾了吗?为什么这不立即发生

int* function(int x)
{
    cout << x << endl; // This outputs 5 as expected
    return &x;
}

int main()
{
    int* a = function(5);


    cout << *a; // This still outputs 5. Why?
    cout << endl;

    cout << *a; // It is garbage here as expected
    cout << endl;

    return 0;
}

谢谢

最佳答案

返回局部变量的地址会调用未定义的行为。所以,你很幸运。

局部变量(分配在堆栈上)在离开其范围时被删除,在您的情况下是 function() 结束时。但是,在变量离开作用域后,它占用的内存不会立即被重写,除非重新使用该内存,否则 x 的值将保留在那里。

由于它会调用 UB,因此您尝试读取该内存的内容可能会导致读取正确的值、读取垃圾、您的程序崩溃或其他任何情况。

关于c++ - 为什么 c++ 变量没有立即删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26886768/

相关文章:

c++ - 使用指针输入字符串的一些问题

文件中的字符重复 - 不区分大小写

c - 编译器在c中分配垃圾值的贡献

java - spring-mvc 中 swagger-ui (io.swagger) 的描述中出现了垃圾值 --> ��� ,如何删除它?

c++ - vector push_back 的垃圾值

c++ - 将数组传递给函数并返回指针

c++ - 有条件包含 : integral constant expression is unlimited?

c++ - ROS:订阅函数无法识别我的回调方法

c++ - 你能在 C++ 中混合使用 free 和 constructor 吗?

c++ - 将按引用传递的变量分配给结构成员时会发生什么