2013-10-21 138 views
2

我試圖如下分配一個數組:成員函數內存分配堆棧還是堆?

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

間接地,數組將被動態分配(因爲foo是動態分配的) - 但是,我很不清楚你想用'foo'中的這個未使用的變量實現什麼? – codeling

+1

@nyarlathotep - 傑克創造了一個最低工作示例來說明他的問題。 –

+1

@nyarlathotep:不,它不會。像任何局部變量一樣,它是自動的,即在堆棧上(除非你指定'static'或'threadlocal',但即使這樣它也不會是動態的)。動態分配一個對象意味着它的成員在堆上。 –

回答

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陣列。

+0

謝謝,就是這樣。 – Jack

1

您期待以下函數在堆上分配arr嗎?

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

當然你不會。該功能foo:func沒有什麼不同,只是this自動傳遞。 this是否在堆上沒有區別。

1

數組被分配在func()的棧幀中,就像它通常發生在局部變量一樣。我不確定爲什麼這個代碼會導致段錯誤。除非尊重這個網站的名稱。