[问题] class解构function呼叫问题

楼主: jobsdone (完工了)   2016-10-29 23:26:54
最近在写作业时遇到了一些问题
作业内容是关于用link-list作为替代array的应用
在做完后需要在解构式中自己回收内存
然而有些函式呼叫后会产生问题
在测试了很多次后发现问题大概是出在当想要回传一个物件时
在回传后会自动呼叫解构式
所以目前的解决方式是用一个flag让内存不要释放
但是这不是长久之计所以想了解有没有其他方法可以避免这样情形
由于本来的code还蛮长的
所以我用一个简单例子也是同样问题希望大家帮我挑毛病
class ball{
public:
ball();
~ball();
ball fun();
};
ball::~ball(){
cout<<"*"<<endl;
}
ball ball:: fun(){
return (*this);
}
int main(){
ball b1;
b1.fun();
return 0;
}
我大概知道问题是出在呼叫fun的时候
因为fun的形式是ball 所以结束完会呼叫解构
然后呼叫解构的是b1
在这个例子中会印出*
但是如果释放内存的话,可能整个b1的内容都不见了
所以想要请问大家
关于解构式的呼叫观念我有没有错
以及如果遇到这样大家会怎么解决
作者: kwpn (ITSST)   2016-10-29 23:47:00
呼叫fun完不会解构b1啊
作者: descent (“雄辩是银,沉默是金”)   2016-10-30 00:22:00
你的 linked list 是自己写的还是用 std::list
楼主: jobsdone (完工了)   2016-10-30 00:38:00
link list是我自己写的那请问呼叫解构的东西是什么呢
作者: ralts (拉鲁拉丝)   2016-10-30 00:56:00
是main跑完才解构的
作者: kwpn (ITSST)   2016-10-30 01:21:00
你可以建构时也打印
楼主: jobsdone (完工了)   2016-10-30 01:26:00
我试了 只会在生成b1时 呼叫建构式
作者: ilikekotomi (Young)   2016-10-30 01:31:00
fun的回传会呼叫copy ctor 他删掉的不是你想的b1http://cpp.sh/72nl 稍微改了你的code 可以跑看看他解构的不是你想的b1这个情况解构的是回传的物件
楼主: jobsdone (完工了)   2016-10-30 01:40:00
所以link list的情形是我没有copy constructor导致复制同一个地址 然后直接将同一个位置delete 所以结果错误吗然后顺便问一下copy constructor应该和重载=不一样吧?
作者: ilikekotomi (Young)   2016-10-30 01:45:00
copy ctor没写的话 compiler会自动生成但如果你的class内有pointer的时候要自己写我想错误原因很有可能是你讲的情况两个不一样没错 但内容一般应该是一样的class有pointer要重新分配内存在把内容复制到新的位置上 =的写法可以google copy-and-swap
楼主: jobsdone (完工了)   2016-10-30 01:50:00
感谢 我明天试看看
作者: ilikekotomi (Young)   2016-10-30 01:51:00
这样copy ctor写好 =就会跟着写好了
作者: neigence   2016-10-30 12:31:00
可以研究一下=operator 会产生一个b1的copy

Links booklink

Contact Us: admin [ a t ] ucptt.com