亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

棧中分配內存和堆中分配內存有什么講究?

棧中分配內存和堆中分配內存有什么講究?

C C++
風嵐醉 2017-06-13 20:33:04
給對象申請內存可以分配到棧里,也可以分配到堆里,那么什么情況下分配到棧里,什么情況下分配到堆?
查看完整描述

2 回答

已采納
?
onemoo

TA貢獻883條經驗 獲得超454個贊

就像我在第一段中說的:

Coordinate *p = new Coordinate(); 就是用 new 在堆中構造了一個對象,返回其指針給 p,這樣你可以通過 p 使用這個構造出的對象。

而 Coordinate coor; 這樣就是很普通的定義了一個對象?。ê?int a 什么的沒區別呀),當然一般這個對象是在棧中。?


初學時不用太考慮對象是在“堆”中還是在“棧”中,你更應該考慮的是:函數的本地變量(或者說棧中的對象)會隨著函數的退出而銷毀。而new出來的對象則需要你手動delete(或者說是要求你手動控制其生存期)。


那么如果你只是需要一個變量,就普通的定義一個好了,比如 int a; ? Coordinate coor; 之類的。?

但如果你不確定會使用幾個對象,那么你可以用 new 在運行時實例化所需數量的對象。 又或者你需要一個對象在多個函數間傳遞,或者需要一個對象不隨函數退出而銷毀(需要后續使用到它),那你就得手動控制其生存期,也就是要new一個,等后續不需要時再delete掉。


總之可能你現在初學沒經驗,等你用得多了自然就知道什么時候該用 new 了。如果你現在還略搞不清楚,那么也不必鉆牛角尖,到時候你就明白了。


另外提一下(你現在看不懂就別管了):手動管理內存在有的情況下可能會很復雜。有時候根本很難搞清一個對象是在哪里 new 出來的,又該由哪個函數負責 delete 掉…… ?其實很多內存泄漏問題都是由此引起的。 ?后面你會學到 C++ 的智能指針,到時候你關注一下,這是很好的東西(總有人說它們不好,其實不然),在 C++ 中你該學會活用智能指針。

查看完整回答
反對 回復 2017-06-16
?
onemoo

TA貢獻883條經驗 獲得超454個贊

一般說“分配內存”都是指在堆中分配。看你在 C 和 C++ 區中都問了這個問題,在 C 語言中,用 malloc 之類的庫函數所分配的內存就在堆中。C++ 中用 new 創建的對象也在堆中,當然也可以使用從 C 中繼承而來的 std::malloc 之類的。


函數中所有的本地變量,都是在棧中的。所以在棧中創建對象、分配內存并不需要特殊的語法,你一般使用的變量都是在棧中。也就是說一般沒有“在棧中分配內存”這樣的說法。


以上是最通常的用法。不過呢,C++ 中還有一類被稱為 placement new 的 new 用法,它可以在你指定的內存處構造對象,所以如果你向其傳入棧中的地址,是可以在棧中構造對象的。即便是這樣,我覺得這也應該叫作“在棧中構造對象”而非“在棧中分配內存”。 而且絕大多數情況下無需這樣做。

查看完整回答
反對 回復 2017-06-14
  • 風嵐醉
    風嵐醉
    在C++那個視頻里面,實例化對象提供了兩種寫法。一個是用Coordinate *p = new Coordinate();,還有一個是Coordinate coor; 這兩種寫法的應用場合有什么講究嗎。
  • onemoo
    onemoo
    這里寫不開,另給你寫了個回答
  • 2 回答
  • 1 關注
  • 1723 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號