据说当函数在C / C ++中结束时,将自动分配和释放局部变量。
根据我的理解,当被解除分配时,局部变量所持有的值也会被破坏!如果我错了,请纠正我
请考虑以下代码:
void doSomething(int** num)
{
int a = 10;
*num = &a;
} // end of function and a will be destroyed
void main()
{
int* number;
doSomething(&number);
cout << *number << endl; // print 10 ???
}
有人可以为我澄清一下吗?
答案 0 :(得分:8)
你是对的。你的cout可能会也可能不会打印10.它会调用未定义的行为。
为了更多地说明,请尝试在编译器下运行以下代码,而不启用优化。
#include <iostream>
using namespace std;
void doSomething(int** num)
{
int a = 10;
*num = &a;
}
void doSomethingElse() {
int x = 20;
}
int main()
{
int* number;
doSomething(&number);
doSomethingElse();
cout << *number << endl; // This will probably print 20!
}
答案 1 :(得分:5)
在这种情况下,整数a
在堆栈上。您将该变量的地址返回给主程序。调用后该地址位置的值未定义。在某些情况下,如果堆栈的那部分没有被覆盖,它可以打印10(但你肯定不想依赖它)。
答案 2 :(得分:1)
内存的内容实际上并未被破坏。 对于这种情况,num将指向一个未为任何变量分配的位置,但它将保留其内容,该内容设置为10.
答案 3 :(得分:1)
指向的内存已释放回系统。这意味着它将保留它具有的任何值,直到系统将该内存块分配给另一个变量并且它被一个值覆盖。
局部变量超出范围时会被释放。如果您尝试使用out参数将值返回到函数:
void doSomething(int** num)
{
int* a = new int;
*a = 10;
*num = a;
}
int main()
{
int* number = 0;
doSomething(&number);
std::cout << *number << std::endl; // print 10 ???
if (number) delete number;
}
但是,对于这么简单的事情,你最好这样做:
int doSomething()
{
return 10;
}
int main()
{
std::cout << doSomething() << std::endl;
}