[問題] class destructor
▉▂開發平台(Platform): (Ex: Win10, Linux, ...)
MacOSX
編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出)
g++5.4
問題(Question):
大家好,最近在修資料結構這門課,過去雖然有修過計算機程式
,但是兩學分的課所以感覺學得不是很扎實,對於class的部分只有粗略帶過..
所以來這邊請教大家:
對於一個data member中含有pointer的class,初始時會用new配置記憶體,
而自行建立的destructor會用delete釋放配置給該指標的記憶體,請問這樣的狀況下
該怎麼在member function中回傳一個local的class變數呢?
因為函數功能的需要,必須在函數中宣告一個class變數a來承接運算的結果,並return
該變數給calling function,由calling function中的class變數b承接,但是這樣的情
況下,由於member function terminates, destructor將a裡面的pointer給delete掉,
造成calling function中b裡面的指標指向一個直隨時有可能被修改的地方...
有自己試著去overload operator=及建立copy constructor來看看是否可以讓calling
function 中b裡面的pointer指向一個新的地方,在複製a的值過去,但好像a會先被
destructed(?!)..
上網查了很多destructor, return object的關鍵字,都找不到想要的答案..
在這裡麻煩大家解答了..
在下面附上class 的程式碼,大致上是我在建立一個stack的class 有一個destructor:
~Stack(){delete [] stack
初始的constructor有用new給該指標動態配置記憶體
問題卡在是我要寫一個member function splitStack(),作用是要將某個stack從中間
某個點分開拆成兩個stack,所以這個function 必須return stack型態的variable,
但是splitStack()中宣告的first再回傳值給main後,就被解構了..
程式碼(Code):(請善用置底文網頁, 記得排版)
http://codepad.org/IjGU1cDW
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.47.182.50
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1507466726.A.1A7.html
推
10/08 21:07,
7年前
, 1F
10/08 21:07, 1F
→
10/08 21:08,
7年前
, 2F
10/08 21:08, 2F
→
10/08 22:07,
7年前
, 3F
10/08 22:07, 3F
→
10/08 22:08,
7年前
, 4F
10/08 22:08, 4F
→
10/08 22:17,
7年前
, 5F
10/08 22:17, 5F
→
10/08 22:20,
7年前
, 6F
10/08 22:20, 6F
→
10/08 22:21,
7年前
, 7F
10/08 22:21, 7F
→
10/08 22:22,
7年前
, 8F
10/08 22:22, 8F
→
10/08 22:22,
7年前
, 9F
10/08 22:22, 9F
→
10/08 22:40,
7年前
, 10F
10/08 22:40, 10F
→
10/08 22:42,
7年前
, 11F
10/08 22:42, 11F
→
10/08 23:20,
7年前
, 12F
10/08 23:20, 12F
→
10/08 23:20,
7年前
, 13F
10/08 23:20, 13F
→
10/08 23:20,
7年前
, 14F
10/08 23:20, 14F
→
10/08 23:20,
7年前
, 15F
10/08 23:20, 15F
→
10/08 23:21,
7年前
, 16F
10/08 23:21, 16F
→
10/08 23:21,
7年前
, 17F
10/08 23:21, 17F
→
10/08 23:21,
7年前
, 18F
10/08 23:21, 18F
→
10/08 23:21,
7年前
, 19F
10/08 23:21, 19F
→
10/08 23:21,
7年前
, 20F
10/08 23:21, 20F
→
10/08 23:22,
7年前
, 21F
10/08 23:22, 21F
→
10/08 23:22,
7年前
, 22F
10/08 23:22, 22F
→
10/08 23:22,
7年前
, 23F
10/08 23:22, 23F
喔喔喔瞭解了,真的是犯傻才會把operator=又刪掉XDD,現在程式可以work了,
非常感謝j大跟s大的解說!
不過想另外請教s大,關於第三點,為什麼會說傳回reference呢?是因爲傳回值
有什麼缺點嗎?謝謝。
※ 編輯: s5031588 (114.47.182.50), 10/09/2017 00:44:19
推
10/09 01:04,
7年前
, 24F
10/09 01:04, 24F
→
10/09 05:57,
7年前
, 25F
10/09 05:57, 25F
→
10/09 05:57,
7年前
, 26F
10/09 05:57, 26F
→
10/09 05:57,
7年前
, 27F
10/09 05:57, 27F
→
10/09 05:58,
7年前
, 28F
10/09 05:58, 28F
→
10/09 05:58,
7年前
, 29F
10/09 05:58, 29F
→
10/09 05:58,
7年前
, 30F
10/09 05:58, 30F
→
10/09 05:58,
7年前
, 31F
10/09 05:58, 31F
→
10/09 05:58,
7年前
, 32F
10/09 05:58, 32F
→
10/09 05:58,
7年前
, 33F
10/09 05:58, 33F
→
10/09 05:58,
7年前
, 34F
10/09 05:58, 34F
→
10/09 05:59,
7年前
, 35F
10/09 05:59, 35F
謝謝s大與l大的回覆,原來回傳值會產生一個臨時物件,一直以為回傳的值會直接
回到main,由main裡面的物件去接收...看來我原本誤會很深
再次感謝三位的回覆。
※ 編輯: s5031588 (49.215.209.133), 10/09/2017 09:16:04
推
10/09 10:02,
7年前
, 36F
10/09 10:02, 36F
回james:好的我會研究看看,謝謝建議。
照著大家說得下去改了程式碼:http://codepad.org/RYcz2e7B
main:http://codepad.org/cM17bFfK
為什麼我原本用b=a.splitStack(1)的時候,當等式結束的時候splitStack()裡面的first
會被destructor給刪除,然而改成上面main裡面的方式用Stack b(a.splitStack(1))時,
卻沒有呼叫destructor來解構first的跡象...?
另外,為什麼用copy assignment的時候,似乎是等到等號結束時,程式才會呼叫
destructor來解構first,而不是splitStack一結束就呼叫呢?
我好亂啊..QQ
※ 編輯: s5031588 (49.215.209.133), 10/09/2017 10:52:07
→
10/09 13:50,
7年前
, 37F
10/09 13:50, 37F
→
10/09 13:50,
7年前
, 38F
10/09 13:50, 38F
→
10/09 13:51,
7年前
, 39F
10/09 13:51, 39F
→
10/09 20:09,
7年前
, 40F
10/09 20:09, 40F
→
10/09 20:09,
7年前
, 41F
10/09 20:09, 41F
→
10/09 20:09,
7年前
, 42F
10/09 20:09, 42F
→
10/09 20:09,
7年前
, 43F
10/09 20:09, 43F
謝謝c大的回答,我會再參考看看。
回s大:我不知道我有沒有開最佳化欸,我不管在xcode裡面跑(似乎是debug mode
我也不知道怎麼看,整個IDE我只會有按過run跟新增專案而已..慘)還是用終端機跑
g++-5 main.cpp的指令出來的結果就是destructor只被呼叫了兩次(最後離開main的時
候),後來一步步看,似乎跑的時候系統一開始就直接把first.stack與b.stack指向
同一個地方了,所以最後destructor只有呼叫兩次,一次是delete a.stack
另一次是delete b.stack(first.stack),似乎這就是s大你說的first被RVO..
再次感謝s大,還讓你幫我跑一次~
※ 編輯: s5031588 (36.236.99.33), 10/10/2017 12:16:25