我写了一些涉及在 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/