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