【问题标题】:Member function memory allocation stack or heap?成员函数内存分配栈还是堆?
【发布时间】:2013-10-29 19:43:36
【问题描述】:

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

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 将被放置在堆上(因为类的实例在堆上)。当我遇到分段错误时,情况似乎并非如此。如果我将 a 的声明更改为: 双* arr = 新双[13*64*64*64]; (并正确删除)然后一切都很好。

这里发生了什么?

【问题讨论】:

  • 间接地,数组将被动态分配(因为 foo 是动态分配的) - 但是,我很不清楚你想用foo中的这个未使用的变量来实现什么?
  • @nyarlathotep - Jack 创建了一个最小的工作示例来说明他的问题。
  • @nyarlathotep:不,不会。像任何局部变量一样,它是自动的,即在堆栈上(除非您指定 staticthreadlocal,但即使那样它也不会是动态的)。动态分配一个对象只意味着它的成员在堆上。
  • 啊,当然,与链接问题的区别在于它在方法中而不是类的成员中,对,就像 Hugo T 的回答指出的那样?谢谢指正

标签: c++ memory-management heap-memory stack-memory


【解决方案1】:

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

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

【讨论】:

  • 谢谢,就是这样。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2019-09-16
      • 2018-07-24
      • 2011-02-18
      • 2012-07-29
      • 2011-05-28
      相关资源
      最近更新 更多