C ++中的指针引用的生存期

问题描述 投票:0回答:1

我写了一些涉及在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后出现错误,因为第二次调用时修改的指针所指向的内容不可用。

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

c++ memory
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.