2011-05-04 103 views

回答

28

你也可以有你的類自動情況下,不使用new,如:

class A{}; 

//automatic 
A a;    

//using new 
A *pA = new A(); 

//using malloc and placement-new 
A *pA = (A*)malloc(sizeof(A)); 
pA = new (pA) A(); 

//using ONLY placement-new 
char memory[sizeof(A)]; 
A *pA = new (memory) A(); 

最後兩正在使用placement-new,與略有不同。 placement-new用於通過調用構造函數來構造對象。在第三個例子中,malloc只分配內存,它不調用構造函數,這就是爲什麼使用placement-new來調用構造函數來構造對象。

另請注意如何刪除內存。

//when pA is created using new 
    delete pA; 

    //when pA is allocated memory using malloc, and constructed using placement-new 
    pA->~A(); //call the destructor first 
    free(pA); //then free the memory 

    //when pA constructed using placement-new, and no malloc or new! 
    pA->~A(); //just call the destructor, that's it! 

要知道什麼是投放新的,閱讀這些常見問題解答:

+2

+1:我想知道*不是動態分配*的正確術語是什麼。 *自動* - 謝謝! – 2011-05-04 15:16:34

+3

此外,要了解使用自動實例的優點,您需要了解[RAII](http://stackoverflow.com/questions/712639/)。 – 2011-05-04 15:20:51

+0

'auto'變量有時也被稱爲'stack'變量。有多少程序員實際上使用'auto'關鍵字? – 2011-05-04 15:23:44

5

你可以只申報一個普通變量:

YourClass foo; 
+1

假設它有一個默認的構造函數。 – Nick 2011-05-04 15:14:40

+0

我在哪裏可以找到關於「正常變量」的更多信息? – 2016-01-05 13:03:54

-3

不應使用new創建C++中的大多數對象。當你需要創建的對象的數量

class Person { 
    ... 
}; 


int main() { 
    int x = 3; 
    boolean b = true; 
    Person p("fred"); 
} 

創建新的對象應保留的場合,當你需要多態,或可能:相反,你應該以同樣的方式,你將創建整數或布爾創建它們,但在編譯時你不知道有多少。

+1

不,關於如何創建對象的決定取決於對象應該生存多長時間。如果它只存在於給定函數的範圍和生命週期內,那麼將其作爲一個'auto'局部變量是有意義的。如果它必須存在於函數執行之外,則需要動態分配。還有的創建多少個對象的問題,即,而是具有單個實例它們的列表或數組。 – 2011-05-04 15:20:31

+0

一點也不 - 我可以在一個函數創建一個實例,並通過複製,它返回到調用函數,我會爲一個整數的一個實例。做你寫的回報的std ::字符串通過指針返回它們的全部功能? – 2011-05-04 15:23:11

+0

這聽起來像你真的喜歡複製對象... – 2013-06-30 20:52:46

0

使用malloc會給你新的結果,只是不調用構造函數。

+0

不完全錯誤的,所以沒有-1 ...這隻有在構造函數什麼都不做類沒有任何虛方法有點正確? – 2011-05-05 04:48:29

2

任何常用的方法:作爲本地或靜態變量,或作爲臨時的。一般而言,當對象具有標識並且生命週期不對應於作用域或其多態時,在C++中使用new的唯一時間爲 。 (當然有 例外,但不是很多。)如果對象可以複製 ,通常最好使用本地實例,根據需要複製 。 (就像你會爲int,其實。)

相關問題