虽然先前已经问Is it possible to deallocate a statically defined array?类似的问题,但我有一个相关的问题。
int* foo()
{
int arr[3] = {1, 2, 3};
return arr;
}
int bar(const int*)
{
doSomething with int*;
}
int main()
{
bar( foo() );
}
分配给arr
中foo()
的内存何时会被释放?静态分配的数组如arr
通常不是自动的吗?这种语法似乎有效,分配给arr
的内存在bar()
完成后才被解除分配?或者不是吗?如果没有,我将如何释放它?
答案 0 :(得分:2)
最有可能的是,它将在foo
调用内的堆栈上创建。当foo
退出时,堆栈指针被重置。该阵列被认为不再可访问。
您仍然可以看到它,因为您的程序拥有堆栈所在的内存。但是,一旦其他东西被推入堆栈,它就会被覆盖。
因此,您不应在foo
之外使用它。
答案 1 :(得分:2)
您的数组的行为类似于普通变量,因为它实际上是一个变量。
C或C ++中的变量范围可由当前块定义,即您的函数foo
。
由于您的数组arr
位于程序的堆栈区域内,因此您不应该每次都返回指向局部变量的指针。
在foo
函数返回后,堆栈内存部分无效,因此如果取消引用foo
的返回值,则可以访问不允许的内存区域。这导致未定义的行为。所以一切都可以破裂或什么都不但这不是你想要的。
如果要返回更长的生命数组,可以通过使用 new
或 malloc
创建数组来在堆内存部分中分配内存即可。在返回foo
- 函数后,您可以访问它。但您必须手动 free
或 delete[]
您的数组。
您应该阅读有关C / C ++中内存布局的更多信息:http://www.geeksforgeeks.org/memory-layout-of-c-program/