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

時間 2021-08-16 03:09:23

1樓:匿名使用者

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

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

解構函式:

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

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

2樓:會唱歌的清水辿

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

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

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

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

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

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

c 中解構函式在成員函式中的呼叫問題

因為第二種方法你沒有定義拷貝建構函式,所以ab operator int a 執行完之後,返回的是return this,會在記憶體中再次構造一個ab的物件,並且把 this指向的物件按位拷貝給這個物件,建立這個物件的時候,會用到x new int 2 分配一段記憶體。由於有a 3 會再次呼叫按位拷...

c中建構函式與解構函式的問題,C 中建構函式與解構函式的問題

你的getname函式在 你的類定義中只有getscore和getid c 關於建構函式和解構函式呼叫次數的問題 沒問題啊。引數傳遞的時候第一次拷貝構造呼叫,在函式返回的時候賦值給c2 再次呼叫了拷貝構造。析構的話 c1 c2 c 三次 傳遞引數和返回引數各一次拷貝建構函式,所以是2次 有兩個物件c...

c解構函式何時呼叫,C 解構函式何時呼叫

建構函式是建立的時候也就是new的時候呼叫,析構是釋放也就是delete的時候呼叫,你new的話應該是呼叫建構函式 也就是 date date int i 程式第39行,people的建構函式裡面有一行date birthday 1 建立了一個date類的臨時變數。當函式退出的時候,這個變數也會被撤...