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();現在はスタックに割り当てられています。arrbar

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 に答える