这是为这个数组保留的内存何时解除分配?

时间:2014-05-15 12:31:31

标签: c arrays memory

虽然先前已经问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() );
    }

分配给arrfoo()的内存何时会被释放?静态分配的数组如arr通常不是自动的吗?这种语法似乎有效,分配给arr的内存在bar()完成后才被解除分配?或者不是吗?如果没有,我将如何释放它?

编辑:对不起,忘了包含main。是的,这似乎是一个重复的帖子。

2 个答案:

答案 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/