c++ - C++中指针引用的生命周期

标签 c++ memory

我写了一些涉及在 C++ 中移动和更改变量的代码。下面是我写的。

#include <iostream>

void six(int*& ptr) {
    int s = 6;
    ptr = &s;
}

int main() {
    int f = 5;
    int* ptr = &f;

    std::cout << *ptr << '\n';
    six(ptr);

    if (ptr) {
        std::cout << *ptr;
    }
    else {
        std::cout << "null\n";
    }

    return 0;
}

所以这打印:

5
6

我尝试了另一个代码,添加了一行:

#include <iostream>

void six(int*& ptr) {
    int s = 6;
    ptr = &s;
    free(&s); // added line
}

int main() {
    int f = 5;
    int* ptr = &f;

    std::cout << *ptr << '\n';
    six(ptr);

    if (ptr) {
        std::cout << *ptr;
    }
    else {
        std::cout << "null\n";
    }

    return 0;
}

显然,这在打印 5 后会出错,因为修改后的指针指向的内容在第二次调用时不可用。

但是,我对第一种情况感到困惑。在main函数中调用six时,变量s不在main作用域内,但其值本身仍继续留在内存中被引用。当超出范围时,C++ 不会自动销毁变量并清除它们吗?这是内存泄漏吗?

最佳答案

第一种情况不是内存泄漏,而是未定义的行为,因为您的变量超出了范围。

在这种情况下,您不知道何时清理(替换)或重新分配内存。

所以在某些情况下结果可能是正确的,但这纯粹是运气问题。

关于c++ - C++中指针引用的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59317374/

相关文章:

memory - u-boot 占用多少 DRAM?

c - 如何将分配的内存分解为多个区域并分配给进程?

c++ - 自定义内存分配器 : T* pointer, operator new 与 void pointer cast

c++ - c++ 数组和内存错误

c++ - 如何调用与另一个同名的成员函数?

c++ - const 对象和 const 构造函数

c++ - 如何使用户无法删除动态数组?

c++ - boost 线程代码 ~uintmax_t(0)

c++ - 编译Qt插件项目出错

javascript - 在哪里可以找到页面(包括图像和多媒体)的真实内存使用情况?