成员函数内存分配堆栈还是堆?

时间:2013-10-21 10:46:57

标签: c++ memory-management stack heap

我正在尝试按如下方式分配数组:

class foo{
public:
    void func(){double arr[13][64][64][64];}
};

int main()
{
    foo* inst = new foo();
    inst->func();       
    return 0;
}

我的答案如下: Does this type of memory get allocated on the heap or the stack? 数组arr将放在堆上(因为类的实例在堆上)。当我遇到分段错误时,情况似乎并非如此。如果我将声明更改为:     double * arr = new double [13 * 64 * 64 * 64]; (并正确删除)然后一切都很好。

这里发生了什么?

3 个答案:

答案 0 :(得分:6)

您将成员变量与成员函数中声明的变量混淆。

class Foo {
  public:
    int arr[13][64][64][64]; //Will be allocated in the same memory as the instance

    void func() {
      int arr2[13][64][64][64]; //Will always be allocated on the stack
    };
};

因此,如果在堆上分配Foo* foo = new Foo() arr,则因为整个foo对象在堆上分配。另一方面,Foo bar();现在arr被分配在堆栈上,因为在堆栈上分配了bar

调用foo->func()bar.func()将在堆栈上分配arr1数组。

答案 1 :(得分:1)

您是否希望以下函数在堆上分配arr

void free_func(foo * this_)
{
    double arr[13][64][64][64];
}

当然你不会。除foo:func自动传递外,函数this没有什么不同。 this是否在堆上是没有区别的。

答案 2 :(得分:1)

数组在func()的堆栈帧中分配,就像通常发生在局部变量中一样。我不确定为什么这段代码会导致段错误。除非尊重本网站的名称。