2010-02-19 45 views

回答

4

在堆棧上。

當做new(或malloc及其朋友,如果你正在做C風格的事,你不應該在C++中)時,內存只分配在堆上。

+0

這是否始終如此?如果A對象有一個巨大的私有成員(雙數組[1000000];)?這是否仍然分配在堆棧中? – kgiannakakis 2010-02-19 13:43:59

+0

對象本身仍將被分配到堆棧上,即使它的某些成員可能是指向堆分配對象的指針 – 2010-02-19 13:58:31

8

當你說:

for (...) { A a; } 

的變量是不是正在構建靜態。這將是:

for (...) { static A a; } 

其實在你的代碼,一個是自動對象,在棧上創建。但是,這並不意味着不會發生動態分配。如果A是這樣的:

struct A { 
    A() { p = new char[100]; } 
    char *p; 
}; 

然後當你說:

for (...) { A a; } 

存儲爲A.P是在棧上創建的,但A.P點是動態創建的存儲。

2

你沒有在你的代碼中聲明static變量 - 它是一個本地作用域變量,因此它將在棧上結束。

0

這不是一個靜態變量。 A也被分配在堆棧上。
只有在明確指定new ed和delete時,纔會在堆上分配變量。

0

A將被完全分配在堆棧上。當然,A可以在構建過程中從堆中分配內存。

0

靜態和常量變量放置在特殊區域的堆棧中。

0

該變量在堆棧上創建。在您的代碼:

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; 

同樣的程序員用它來調用「靜態變量」和「變量聲明爲靜態」。

相關問題