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

看板C_and_CPP (C/C++)作者 (leeleo)時間5年前 (2020/01/26 01:22), 編輯推噓5(5024)
留言29則, 5人參與, 5年前最新討論串1/1
程式碼如下 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

01/26 01:46, 5年前 , 1F
你沒寫copy ctor
01/26 01:46, 1F

01/26 01:46, 5年前 , 2F
所以by value之後obj3裡面跟obj會是同個指標
01/26 01:46, 2F

01/26 01:46, 5年前 , 3F
obj3解構刪一次 obj再刪就double delete了
01/26 01:46, 3F

01/26 01:48, 5年前 , 4F
因為你copy constructor是default行為 data pointer是
01/26 01:48, 4F

01/26 01:49, 5年前 , 5F
看起來是因為淺層複製,obj3解構時刪掉obj的data了
01/26 01:49, 5F

01/26 01:50, 5年前 , 6F
會是shallow copy 所以call copy function傳進去解構一次
01/26 01:50, 6F

01/26 01:51, 5年前 , 7F
離開main又解構一次
01/26 01:51, 7F

01/26 01:53, 5年前 , 8F
rule of three看一下吧
01/26 01:53, 8F

01/26 02:05, 5年前 , 9F
大概了解了,感謝各位
01/26 02:05, 9F

01/26 22:41, 5年前 , 10F
不好意思,剛剛發現後來我把程式碼改成不用傳送obje
01/26 22:41, 10F

01/26 22:41, 5年前 , 11F
ct過去之後,仍然會被解構兩次,想請教為什麼會這樣
01/26 22:41, 11F

01/26 22:42, 5年前 , 12F
01/26 22:42, 12F

01/26 23:41, 5年前 , 13F
一樣的問題阿...再去瞭解desturctor何時發生吧
01/26 23:41, 13F

01/27 01:11, 5年前 , 14F
剛剛有用debug模式下去跑過,最後會被解構兩次好像是
01/27 01:11, 14F

01/27 01:11, 5年前 , 15F
因為obj指向tem
01/27 01:11, 15F

01/27 01:12, 5年前 , 16F
但是關於結構的時機,我原本想說是:第一次tem被解構
01/27 01:12, 16F

01/27 01:12, 5年前 , 17F
是因為超出生存空間,所以呼叫解建構子,但是第二次
01/27 01:12, 17F

01/27 01:12, 5年前 , 18F
解建構就不太理解,debug模式跑出來是在第一次解建構
01/27 01:12, 18F

01/27 01:12, 5年前 , 19F
完就立即再解構一次,照理說不是應該執行到最後一行
01/27 01:12, 19F

01/27 01:12, 5年前 , 20F
才會呼叫的嗎?
01/27 01:12, 20F

01/27 01:13, 5年前 , 21F
我有在新的程式最下面再加一行輸出"abc"來看比較明顯
01/27 01:13, 21F

01/27 01:13, 5年前 , 22F
,結果是先解建構兩次才會輸出"abc",所以想問說為什
01/27 01:13, 22F

01/27 01:13, 5年前 , 23F
麼不是先解構一次,然後輸出"abc",然後再解構一次呢
01/27 01:13, 23F

01/27 01:13, 5年前 , 24F
01/27 01:13, 24F

01/27 01:14, 5年前 , 25F
改過的程式碼:https://ideone.com/2UUrXk
01/27 01:14, 25F

01/27 02:18, 5年前 , 26F
obj = obj.ret() 這行有個臨時物件 賦值後就解構了
01/27 02:18, 26F

01/27 02:20, 5年前 , 27F
覺得你在鬼打牆耶 有瞭解rule of three嗎
01/27 02:20, 27F

01/27 12:27, 5年前 , 28F
抱歉我再去重看一下,謝謝
01/27 12:27, 28F

02/03 09:55, 5年前 , 29F
去了解一下Rule-of-Three 與 Rule-of-Zero 吧
02/03 09:55, 29F
文章代碼(AID): #1UB7bjlE (C_and_CPP)
文章代碼(AID): #1UB7bjlE (C_and_CPP)