作者ac01965159 (leeleo)
看板C_and_CPP
标题[问题] 请问有关於destructor的问题
时间Sun Jan 26 01:22:49 2020
程式码如下
https://ideone.com/ayqXkd
这个程式是一个测试程式,因为在写别的东西时遇到问题。
在这个程式执行完,会说有物件被呼叫两次解建构子,我用debug mode下去观察发现是
obj这个物件被解建构两次,一次是呼叫copy()结束时,一次是结束程式时,但是我不
解的是,我的copy函数是用call by value的方式,但是却还是会动到我传过去的参数的
内容,把我传过去的obj解建构了,这点不了解为什麽。
後来发现只要把copy那个改成call by reference,之後就全部正常了,但是不知道为什
麽,想请教各位,谢谢。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 124.9.128.249 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1579972973.A.BCE.html
1F:→ a58524andy: 你没写copy ctor 01/26 01:46
2F:→ a58524andy: 所以by value之後obj3里面跟obj会是同个指标 01/26 01:46
3F:→ a58524andy: obj3解构删一次 obj再删就double delete了 01/26 01:46
4F:推 ko27tye: 因为你copy constructor是default行为 data pointer是 01/26 01:48
5F:推 HSUFIT: 看起来是因为浅层复制,obj3解构时删掉obj的data了 01/26 01:49
6F:→ ko27tye: 会是shallow copy 所以call copy function传进去解构一次 01/26 01:50
7F:→ ko27tye: 离开main又解构一次 01/26 01:51
8F:推 ko27tye: rule of three看一下吧 01/26 01:53
9F:→ ac01965159: 大概了解了,感谢各位 01/26 02:05
10F:→ ac01965159: 不好意思,刚刚发现後来我把程式码改成不用传送obje 01/26 22:41
11F:→ ac01965159: ct过去之後,仍然会被解构两次,想请教为什麽会这样 01/26 22:41
13F:推 ko27tye: 一样的问题阿...再去了解desturctor何时发生吧 01/26 23:41
14F:→ ac01965159: 刚刚有用debug模式下去跑过,最後会被解构两次好像是 01/27 01:11
15F:→ ac01965159: 因为obj指向tem 01/27 01:11
16F:→ ac01965159: 但是关於结构的时机,我原本想说是:第一次tem被解构 01/27 01:12
17F:→ ac01965159: 是因为超出生存空间,所以呼叫解建构子,但是第二次 01/27 01:12
18F:→ ac01965159: 解建构就不太理解,debug模式跑出来是在第一次解建构 01/27 01:12
19F:→ ac01965159: 完就立即再解构一次,照理说不是应该执行到最後一行 01/27 01:12
20F:→ ac01965159: 才会呼叫的吗? 01/27 01:12
21F:→ ac01965159: 我有在新的程式最下面再加一行输出"abc"来看比较明显 01/27 01:13
22F:→ ac01965159: ,结果是先解建构两次才会输出"abc",所以想问说为什 01/27 01:13
23F:→ ac01965159: 麽不是先解构一次,然後输出"abc",然後再解构一次呢 01/27 01:13
24F:→ ac01965159: ? 01/27 01:13
26F:推 ko27tye: obj = obj.ret() 这行有个临时物件 赋值後就解构了 01/27 02:18
27F:→ ko27tye: 觉得你在鬼打墙耶 有了解rule of three吗 01/27 02:20
28F:→ ac01965159: 抱歉我再去重看一下,谢谢 01/27 12:27
29F:→ adrianshum: 去了解一下Rule-of-Three 与 Rule-of-Zero 吧 02/03 09:55