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

我想分配一个数组,如下所示:

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

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

我在回答的印象中,例如:这种类型的内存是否分配在堆或栈上? 数组arr会放在堆上(因为类的实例在堆上)。 这似乎并不是这样,因为我得到了分段错误。 如果我将声明更改为:double * arr = new double [13 * 64 * 64 * 64]; (并正确删除它),那么一切都很好。

这里发生了什么事?


你在成员函数中声明变量的成员变量是令人困惑的。

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数组。


你会期望以下函数在堆上分配arr吗?

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

当然你不会。 函数foo:func没有什么不同,除了this是自动传递的。 无论this是堆还是不堆都没有区别。


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

链接地址: http://www.djcxy.com/p/14567.html

上一篇: Member function memory allocation stack or heap?

下一篇: How to Install Bi Server in Pentaho?