[问题] 请问有关于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