指针引用的生存期(以 C++为单位)

The lifetime of a pointer reference in C++

本文关键字:C++ 为单位 引用 生存期 指针      更新时间:2023-10-16

我写了一些代码,涉及在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 << "nulln";
}
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 << "nulln";
}
return 0;
}

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

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

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

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

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