2

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

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

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

我对答案的印象是: 这种类型的内存是在堆上分配的还是在堆栈上分配的? 数组 arr 将被放置在堆上(因为类的实例在堆上)。当我遇到分段错误时,情况似乎并非如此。如果我将 a 的声明更改为: double* arr = new double[13*64*64*64]; (并正确删除)然后一切都很好。

这里发生了什么事?

4

3 回答 3

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

于 2013-10-21T10:57:22.480 回答
1

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

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

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

于 2013-10-21T10:50:28.137 回答
1

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

于 2013-10-21T10:50:59.543 回答