成员函数内存分配堆栈还是堆?
我想分配一个数组,如下所示:
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()
的堆栈框架中分配,就像它通常发生在局部变量一样。 我不确定为什么这个代码会导致段错误。 除非尊重这个网站的名称。