2010-04-27 43 views
3

可能重複:
When to use 「new」 and when not to, in C++?
When should I use the new keyword in C++?爲什麼我需要撥打新電話?

好像我可以編程,而沒有使用這個詞new東西,我絕不會擔心要麼刪除任何內容,所以我爲什麼要打電話呢?

從我的理解,這是因爲我會用盡堆棧內存。

這是正確的嗎?我想我的主要問題是,我應該何時打電話給new

+1

Dupe http://stackoverflow.com/questions/679571/when-to-use-new-and-when-not-to-in-c – 2010-04-27 12:34:20

+0

And:http://stackoverflow.com/questions/655065/我應該使用新關鍵字in-c – fretje 2010-04-27 12:39:35

回答

8

它是對象的生命週期的問題:如果你堆棧分配的對象,該對象的析構函數將被調用時,這些對象出去(例如,在方法結束時)。這意味着如果您將這些對象從創建它們的方法中傳出,您將發現自己隨時可以覆蓋內存的指針。

+2

爲什麼downvote? – 2010-04-27 12:40:06

5

這是因爲在編譯時您可能不知道您是否需要一個對象,或者需要多少個對象,或者需要什麼類型的對象。 new運算符允許您動態分配對象,而無需事先知道這些事情。

這裏是不知道對象的類型事先的例子:

class Account { ... }; 
class CheckingAccount : public Account { ... }; 
class VisaAccount : public Account { ... }; 

... 

Account *acct = type == "checking" ? new CheckingAccount : new VisaAccount; 
+0

它不允許您生成在運行時確定的類型的對象。類型必須事先知道。至於「多少」,也可以使用標準容器。 – sellibitze 2010-04-27 12:41:00

+0

@sellibitze,'acct'變量在運行時指向什麼類型的對象?你認爲標準容器如何爲它們的元素分配內存? – 2010-04-27 13:23:07

4

您需要使用新建/刪除的主要原因是爲了手動控制對象的生命週期。

其他原因已被其他人提供,但我認爲這是更重要的。使用堆棧,您可以很好地瞭解對象的生命週期。但是如果你想要一個事件發生後才銷燬一個對象,那麼它就不能被自動定義。

+4

爲什麼downvote? – 2010-04-27 12:40:47

-2

[更新]

可以使用來創建新實例一些類的,或分配存儲器(陣列例如),像

對象O =新對象();

在創建類Object的新實例之前,您不能使用它。 (除非你有靜態方法。)(這只是使用的一個例子,有時其他對象會實例化或銷燬你需要/不需要的對象)

這裏有很多很好的答案,但很難解釋所有有關新功能的信息都會在SO上進行回覆,如果您不明白在調用新功能時會發生什麼情況,那麼很難知道何時使用它。這是編程中最重要的領域之一,所以在閱讀基本信息之後,您應該更詳細地研究它。這是可能的一篇文章中,你可以開始你的研究:

http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

主題,你將不得不以瞭解當你調用新的,讓你再能理解的時候調用它會發生什麼學習(也有可能更多,但是這是我能現在想): - 構造(和析構) - 靜態類和方法 ...

+3

如果解釋爲什麼你懶得寫在這裏太長時間了? – 2010-04-27 12:40:09

+0

嗨基思,感謝您的評論,但請評論我的答案,而不是你的解釋。如果你仔細閱讀我的答案,你會注意到我從來沒有說過你*必須*使用NEW,只有NEW,才能創建一個類的實例。只有NEW用於創建類的新實例,這是正確的。 在你實例化之前,除非有一些靜態的東西(我也提到過),否則你不能使用類,但是後來我意識到有很多事情要說這個重要的主題,最好的I能做的是指向更好的來源(阿爾喬姆的回答)。 – user218447 2010-04-27 13:30:59

+2

@ zarko-o其實你剛纔說的是「你需要新來創建一些類的新實例」,這是不正確的。 – meagar 2010-04-27 17:43:02

1

數據的壽命/在棧上創建的對象限制到塊。你不能返回引用/指針。要使數據跨功能可用,可以使用new在堆上創建數據。當然,它可以處於更高層次,甚至是全球化。但是在編譯時你很少知道運行時需要多少數據/多少個對象。

0

你可以編寫很多非平凡的程序,而不需要調用「new」。 (或因此刪除)。

你不能做什麼(至少不用寫或使用你自己的等價物)決定了什麼類型的對象或你想在運行時創建多少,所以你會限制你。