堆栈内存分配

时间:2010-12-10 16:10:17

标签: c++

据说当函数在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 ???
}

有人可以为我澄清一下吗?

4 个答案:

答案 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;
}