回答
在堆棧上。
當做new
(或malloc
及其朋友,如果你正在做C風格的事,你不應該在C++中)時,內存只分配在堆上。
這是否始終如此?如果A對象有一個巨大的私有成員(雙數組[1000000];)?這是否仍然分配在堆棧中? – kgiannakakis 2010-02-19 13:43:59
對象本身仍將被分配到堆棧上,即使它的某些成員可能是指向堆分配對象的指針 – 2010-02-19 13:58:31
當你說:
for (...) { A a; }
的變量是不是正在構建靜態。這將是:
for (...) { static A a; }
其實在你的代碼,一個是自動對象,在棧上創建。但是,這並不意味着不會發生動態分配。如果A是這樣的:
struct A {
A() { p = new char[100]; }
char *p;
};
然後當你說:
for (...) { A a; }
存儲爲A.P是在棧上創建的,但A.P點是動態創建的存儲。
你沒有在你的代碼中聲明static
變量 - 它是一個本地作用域變量,因此它將在棧上結束。
這不是一個靜態變量。 A也被分配在堆棧上。
只有在明確指定new
ed和delete
時,纔會在堆上分配變量。
A將被完全分配在堆棧上。當然,A可以在構建過程中從堆中分配內存。
靜態和常量變量放置在特殊區域的堆棧中。
該變量在堆棧上創建。在您的代碼:
for (...) { A a; }
...然後在任何「爲」週期中,變量將自動爲尼爾說,銷燬(因爲它超出範圍),結束:
尼爾·巴特沃思:其實在你的代碼,一個是自動對象...
但是,如果一個物體在他自己的生命週期,使一些動態分配(督察,對堆),然後要注意自己釋放記憶,或在des中釋放記憶A的交易商或外部。 C示例:
struct A {
A(char *ptr);
~A();
private:
char *p;
int len;
};
A::A(char *ptr)
{
len = strlen(ptr);
p = (char *) malloc(len+1);
if(!p) {
exit(1);
}
strcpy(p, ptr);
}
A::~A()
{
free(p);
}
如果您不調用免費過程,則p變量不會自動釋放。
再見(和我的英語很抱歉)
PS:我想說的是,單詞「靜態」,所以severly在這方面的批評,因爲他們JKP和jldupont也不是那麼壞...
JKP: 「單詞 」靜態「 是有點誤導那裏,這意味着static關鍵字的使用....」
jldupont:「你沒有聲明一個靜態變量.. ..「
等等...
JKP和jldupont 是100%正確的但在意大利的技術語言中的一些C++程序員使用 「創建靜態」 和 「靜態建」 這個詞確定一個變量將堆棧
上創建當你定義一個靜態變量來代替,換句話說
static A a;
同樣的程序員用它來調用「靜態變量」和「變量聲明爲靜態」。
- 1. 堆棧或堆上的對象分配
- 2. 堆分配對象構造函數
- 3. 將堆分配對象上的數據成員分配到堆還是堆棧上?
- 4. 成員函數內存分配堆棧還是堆?
- 5. 在函數中創建的對象,是保存在堆棧還是堆上?
- 6. 堆棧上的構造函數
- 7. 在堆上分配vs在遞歸函數中分配堆棧
- 8. C++是堆棧還是堆分配?
- 9. Python是否有靜態對象,堆棧對象和堆對象?
- 10. 調用堆棧上大對象的構造函數
- 11. 對象分配在堆棧或堆C++
- 12. 分配在堆或棧上?
- 13. NSObject:在堆上還是在棧上?
- 14. 堆分配的對象是否將其成員分配到堆棧上?
- 15. 靜態,堆棧和堆內存分配的地址排序?
- 16. 構造函數調用的存儲位置在哪裏?堆棧還是堆?
- 17. 內嵌在堆棧上的對象分配
- 18. ptrace會中斷CPU上下文,用戶空間堆棧還是內核堆棧?
- 19. 受保護的堆對象堆棧vs堆棧分配
- 20. C++堆棧分配對象,顯式析構函數調用
- 21. 堆 - 構造函數和析構函數,內存分配
- 22. 堆/堆棧上的類成員分配?
- 23. 內存分配,堆棧和堆棧
- 24. 休眠 - 在堆棧上還是在堆上?
- 25. 堆棧/堆上的對象創建?
- 26. C數組實例化 - 堆棧還是堆分配?
- 27. C++在堆和堆棧上分配內存?
- 28. cin是堆棧還是堆棧?
- 29. C++:當使用構造函數創建另一個對象時,該內部對象是否存在於堆棧或堆中?
- 30. 在堆棧上創建對象時分配的內存在哪裏?
「靜態」這個詞在這裏有點誤導,它暗示了static關鍵字的用法,它不會在堆棧上創建變量。 – jkp 2010-02-19 13:35:54
我的意思是靜態而不是動態構造(使用新的) – 2010-02-19 13:44:05