2 回答

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
就像我在第一段中說(shuō)的:
Coordinate *p = new Coordinate(); 就是用 new 在堆中構(gòu)造了一個(gè)對(duì)象,返回其指針給 p,這樣你可以通過(guò) p 使用這個(gè)構(gòu)造出的對(duì)象。
而 Coordinate coor; 這樣就是很普通的定義了一個(gè)對(duì)象?。ê?int a 什么的沒(méi)區(qū)別呀),當(dāng)然一般這個(gè)對(duì)象是在棧中。?
初學(xué)時(shí)不用太考慮對(duì)象是在“堆”中還是在“?!敝?,你更應(yīng)該考慮的是:函數(shù)的本地變量(或者說(shuō)棧中的對(duì)象)會(huì)隨著函數(shù)的退出而銷毀。而new出來(lái)的對(duì)象則需要你手動(dòng)delete(或者說(shuō)是要求你手動(dòng)控制其生存期)。
那么如果你只是需要一個(gè)變量,就普通的定義一個(gè)好了,比如 int a; ? Coordinate coor; 之類的。?
但如果你不確定會(huì)使用幾個(gè)對(duì)象,那么你可以用 new 在運(yùn)行時(shí)實(shí)例化所需數(shù)量的對(duì)象。 又或者你需要一個(gè)對(duì)象在多個(gè)函數(shù)間傳遞,或者需要一個(gè)對(duì)象不隨函數(shù)退出而銷毀(需要后續(xù)使用到它),那你就得手動(dòng)控制其生存期,也就是要new一個(gè),等后續(xù)不需要時(shí)再delete掉。
總之可能你現(xiàn)在初學(xué)沒(méi)經(jīng)驗(yàn),等你用得多了自然就知道什么時(shí)候該用 new 了。如果你現(xiàn)在還略搞不清楚,那么也不必鉆牛角尖,到時(shí)候你就明白了。
另外提一下(你現(xiàn)在看不懂就別管了):手動(dòng)管理內(nèi)存在有的情況下可能會(huì)很復(fù)雜。有時(shí)候根本很難搞清一個(gè)對(duì)象是在哪里 new 出來(lái)的,又該由哪個(gè)函數(shù)負(fù)責(zé) delete 掉…… ?其實(shí)很多內(nèi)存泄漏問(wèn)題都是由此引起的。 ?后面你會(huì)學(xué)到 C++ 的智能指針,到時(shí)候你關(guān)注一下,這是很好的東西(總有人說(shuō)它們不好,其實(shí)不然),在 C++ 中你該學(xué)會(huì)活用智能指針。

TA貢獻(xiàn)883條經(jīng)驗(yàn) 獲得超454個(gè)贊
一般說(shuō)“分配內(nèi)存”都是指在堆中分配??茨阍?C 和 C++ 區(qū)中都問(wèn)了這個(gè)問(wèn)題,在 C 語(yǔ)言中,用 malloc 之類的庫(kù)函數(shù)所分配的內(nèi)存就在堆中。C++ 中用 new 創(chuàng)建的對(duì)象也在堆中,當(dāng)然也可以使用從 C 中繼承而來(lái)的 std::malloc 之類的。
函數(shù)中所有的本地變量,都是在棧中的。所以在棧中創(chuàng)建對(duì)象、分配內(nèi)存并不需要特殊的語(yǔ)法,你一般使用的變量都是在棧中。也就是說(shuō)一般沒(méi)有“在棧中分配內(nèi)存”這樣的說(shuō)法。
以上是最通常的用法。不過(guò)呢,C++ 中還有一類被稱為 placement new 的 new 用法,它可以在你指定的內(nèi)存處構(gòu)造對(duì)象,所以如果你向其傳入棧中的地址,是可以在棧中構(gòu)造對(duì)象的。即便是這樣,我覺(jué)得這也應(yīng)該叫作“在棧中構(gòu)造對(duì)象”而非“在棧中分配內(nèi)存”。 而且絕大多數(shù)情況下無(wú)需這樣做。
- 2 回答
- 1 關(guān)注
- 1719 瀏覽
添加回答
舉報(bào)