C 裡,物件存放在堆裡和存放在棧裡相比有什麼優勢嗎?什麼情況下該優先考慮存堆裡

2021-08-16 03:10:28 字數 3826 閱讀 4924

1樓:匿名使用者

樓上兩位回答都挺好的,我來總結下

第一,堆空間大,適合放陣列以及 類物件(系統自帶或自定義)第二,裡面的資料不會自動清空,這樣就可以利用指標來訪問,(自動清空資料恰好是棧的優點)。所有在使用的時候要辯證來用,如果是用指標來訪問,就用堆,千萬不能用棧

第三、效率低,因為堆空間大,所以相對來說效率會低一點第四、使用堆長期執行,有可能會導致記憶體碎片問題。

綜上所述,堆和棧要結合執行,充分利用兩種的優點。建議採用記憶體池來管理系統所需要的記憶體。

2樓:匿名使用者

棧的空間大小是有限的,可以在編譯器中設定,預設的話一般在1m~2m左右。

而堆的空間在記憶體剩餘空間允許的範圍內是無限的。

在棧上開闢資料,存取效率高,而且無需手動**,在出作用域後系統會自動**。

而堆上開闢的資料就需要自己**了。

由於棧的大小有限,所以只可以儲存一些比較小的變數。如果你的物件相對較大,比如說一個1024位元組的陣列,你還是放到堆裡吧。

對於變長陣列和alloca(),雖然其語法渾然天成,但可能有不可見的記憶體隱患,而且無法做平臺見移植,不推薦使用。

3樓:炎黃天行者

存放在堆裡就可以在你需要釋放的時候去釋放,記憶體需要動態分配的時候或者你需要變數在特定情況下銷燬記憶體。

物件是存放在堆中還是棧中啊?

4樓:匿名使用者

這個要看你是怎麼去構造這個物件的,

一般來說,如果你用new來生成的物件都內是放在堆中容的,而直接定義的區域性變數都是放在棧中的,全域性和靜態的物件是放在資料段的靜態儲存區,例如: class people;people p;//棧上分配記憶體

people* ppeople;ppeople = new people;//堆上分配記憶體

5樓:匿名使用者

物件是存放在堆中 變數名存放在棧中

c++物件是存在堆上還是棧上?

6樓:望穿秋水待伊人

棧,就是那bai些由編譯器du

在需要的時候分配,在不需zhi要的時候自dao動清楚專的變數的儲存區。屬裡面的變數通常是區域性變數、函式引數等。

堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new就要對應一個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

明白了吧?

7樓:

a是實復

實在在的物件,制

這種物件是在棧上的。bai如果,你定義du一個指標zhi,這個指標指向一個dao物件。比如

myclass *p = new myclass;那麼p還是在棧上。但是*p 的地址,也就是p的值,就是堆上的一個地址了。

8樓:匿名使用者

存在棧中抄

// func end

// a生命週期結束

bai 交由編譯器釋du放zhi

// 指標 pmyclass 生命週期結束,但dao是new 的myclass 需要手動釋放

c++中類是存放在棧中的嗎

9樓:幻夢·人生

c++中可以存放物件的地方很多。根據不同的建立實機,放在不同的區域。

普通區域性變數是放在棧中進行儲存的,當函式或者塊退棧時銷燬。

例如:fun()

全域性變數是放在靜態區進行儲存的,程式啟動時建立,結束時銷燬。

使用new方法建立的物件儲存在堆空間中,呼叫delete時被銷燬。

例如:a * a = new a(); // 建立delete(a); // 銷燬

c++,p1,p2兩個物件是存放在堆裡還是棧裡?

10樓:匿名使用者

物件p1例項化在主函式中,即在棧中,p2是一個point類的指標,p2本身只儲存一個指向的物件的地址,所以可以看做不佔用空間,不過位置也是在棧中

11樓:

物件也是一樣的原理,用new的就是在堆上分配記憶體

12樓:匿名使用者

只要沒有new,都是棧裡

c++中解構函式析構堆中物件和棧中物件有什麼區別?

13樓:匿名使用者

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。

2、堆區(heap) — 般由程式設計師分配釋放, 採用誰分配誰釋放的策略。

解構函式:

1,對於棧區的變數如string 類,你定義後,應該程式退出的時候,由程式負責進行對string執行析構操作。

2,對於你申請的指標或動態的陣列,如new char a[10]; 即出的時候,你要自己delete a;才能保證記憶體沒有洩漏。

14樓:會唱歌的清水辿

棧區:儲存了程式作用域內的各種資料,它也相當於編譯器為我們創造的一個擁有固定大小的向系統申請的記憶體,但是我們不需要對其進行釋放,因為程式結束自動釋放(我們只有改變其內部資料結構的權利。),而棧中的資料通過構造器和解構函式進行記憶體的調配,當解構函式進行操作的時候,相當於棧區的一塊記憶體被原始化,返還給棧區這個記憶體,這和系統調配記憶體有相似處。

堆區:堆區的記憶體由程式設計師進行管理,它通過向系統申請記憶體,得到一塊記憶體,但是記憶體的使用由程式設計師負責,它可以用構造器進行構造一個資料結構儲存在這個記憶體塊中,也可以用解構函式將被構造的資料進行摧毀操作,但是即使這個資料被摧毀,對記憶體沒有影響,只用用delete將記憶體還給系統,才是徹底將記憶體進行摧毀。

系統記憶體:系統擁有分發給堆區和棧區記憶體的權利,棧區是編譯器向系統申請的記憶體,它由編譯器進行申請和釋放,而堆區是由程式執行中向系統申請的記憶體,它由程式進行申請和釋放。

記憶體相當於磚頭,即使用磚頭搭建(構造)了任何建築,或者摧毀(析構)了任何建築,只要磚頭沒有少,就對記憶體沒有影響,但是我們如果釋放了少於系統分配的記憶體,因為程式也沒有任何可以使用那部分記憶體的方法,系統也失去了那部分記憶體的使用權利,那麼系統沒有得到的那一部分記憶體就是記憶體洩漏。

但是還有一點,越界訪問,如果我們用構造器構造了一塊系統沒有分配給我們記憶體,我們就擁有了對這塊記憶體的訪問權,但是我們卻沒有返回給系統的權利,因為我們沒有向系統申請過這塊記憶體的使用權,所以這樣也會造成出錯。

見識淺薄,如果理解錯了希望大神指點。。。。。

c語言裡,哪些變數是存放在堆裡,哪些是存放在棧裡?(

15樓:匿名使用者

在c/c++中,記憶體分成5個區,他們分別是堆、棧、自由儲存區、全域性/靜態儲存區和常量儲存區。內容

棧:就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數、函式引數等。

堆:就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般一個new就要對應一個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動**。

自由儲存區:就是那些由malloc等分配的記憶體塊,他和堆是十分相似的,不過它是用free來結束自己的生命的。

全域性儲存區(靜態儲存區):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。程式結束後有系統釋放。

常量儲存區:這是一塊比較特殊的儲存區,他們裡面存放的是常量,不允許修改。

希望對你有幫助

16樓:匿名使用者

放在堆裡的資料時管理員自己開闢空間和釋放空間,如,new 和malloc,而放在棧裡的資料時計算機自動分配記憶體和釋放的,如變數

C語言裡,哪些變數是存放在堆裡,哪些是存放在棧裡

在c c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。內容 棧 就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆 就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,...

如果存放在不讓屍體腐爛並幹掉的棺材裡的死屍如果予以嵌入安裝人

肯定復不能啦,心臟停止波動不是制判定人死亡的唯一標準,還有腦死亡等。心臟最重要的功能是供血給大腦,然後通過中樞神經再將血液分發到各個器官及機能部位。如果是屍體已經存放了好久,體內的血液會凝固掉,血管及各器管 人體機能部分也會僵硬掉,這個時候別說是人工心臟,就算是換一個人體心臟也沒啥用。你說呢!天津 ...

毛巾毯存放在家裡的木箱裡時間久了上面出現黃斑該怎麼除去

毛巾出現黴點,可用少許綠豆芽在黴點處揉搓,然後用清水漂洗,黴點即可去除。新黴斑先用軟刷刷乾淨,再用酒精洗除。陳黴斑先塗上淡氨水,放置一會兒,再塗上高錳酸鉀溶液,最後用亞硫酸氫鈉溶液處理和水洗。皮革衣服上有黴斑時,用毛巾蘸些肥皂水措擦,去掉汙垢後立即用清水洗乾淨,待晾乾後再塗甲克油即可。白色絲綢衣服上...