我正在尝试按如下方式分配数组:
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]; (并正确删除)然后一切都很好。
这里发生了什么?
答案 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()
的堆栈帧中分配,就像通常发生在局部变量中一样。我不确定为什么这段代码会导致段错误。除非尊重本网站的名称。