[問題] 請問有關於destructor的問題

作者: ac01965159 (leeleo)   2020-01-26 01:22:49
程式碼如下
https://ideone.com/ayqXkd
這個程式是一個測試程式,因為在寫別的東西時遇到問題。
在這個程式執行完,會說有物件被呼叫兩次解建構子,我用debug mode下去觀察發現是
obj這個物件被解建構兩次,一次是呼叫copy()結束時,一次是結束程式時,但是我不
解的是,我的copy函數是用call by value的方式,但是卻還是會動到我傳過去的參數的
內容,把我傳過去的obj解建構了,這點不了解為什麼。
後來發現只要把copy那個改成call by reference,之後就全部正常了,但是不知道為什
麼,想請教各位,謝謝。
作者: a58524andy (a58524andy)   2020-01-26 01:46:00
你沒寫copy ctor所以by value之後obj3裡面跟obj會是同個指標obj3解構刪一次 obj再刪就double delete了
作者: ko27tye (好滋好滋)   2020-01-26 01:48:00
因為你copy constructor是default行為 data pointer是
作者: HSUFIT (FireDance)   2020-01-26 01:49:00
看起來是因為淺層複製,obj3解構時刪掉obj的data了
作者: ko27tye (好滋好滋)   2020-01-26 01:50:00
會是shallow copy 所以call copy function傳進去解構一次離開main又解構一次rule of three看一下吧
作者: ac01965159 (leeleo)   2020-01-26 02:05:00
大概了解了,感謝各位
作者: ko27tye (好滋好滋)   2020-01-26 23:41:00
一樣的問題阿...再去瞭解desturctor何時發生吧
作者: ac01965159 (leeleo)   2020-01-27 01:11:00
剛剛有用debug模式下去跑過,最後會被解構兩次好像是因為obj指向tem但是關於結構的時機,我原本想說是:第一次tem被解構是因為超出生存空間,所以呼叫解建構子,但是第二次解建構就不太理解,debug模式跑出來是在第一次解建構完就立即再解構一次,照理說不是應該執行到最後一行才會呼叫的嗎?我有在新的程式最下面再加一行輸出"abc"來看比較明顯,結果是先解建構兩次才會輸出"abc",所以想問說為什麼不是先解構一次,然後輸出"abc",然後再解構一次呢?改過的程式碼:https://ideone.com/2UUrXk
作者: ko27tye (好滋好滋)   2020-01-27 02:18:00
obj = obj.ret() 這行有個臨時物件 賦值後就解構了覺得你在鬼打牆耶 有瞭解rule of three嗎
作者: ac01965159 (leeleo)   2020-01-27 12:27:00
抱歉我再去重看一下,謝謝
作者: adrianshum (Alien)   2020-02-03 09:55:00
去了解一下Rule-of-Three 與 Rule-of-Zero 吧

Links booklink

Contact Us: admin [ a t ] ucptt.com