作者jobsdone (完工了)
看板C_and_CPP
标题[问题] class解构function呼叫问题
时间Sat Oct 29 23:26:54 2016
最近在写作业时遇到了一些问题
作业内容是关於用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的内容都不见了
所以想要请问大家
关於解构式的呼叫观念我有没有错
以及如果遇到这样大家会怎麽解决
--------------------------------------------
http://codepad.org/xcuGPkJR
上面那个ball 的code
我用visual studio逐步执行
发现只要呼叫完fun就会呼叫解构式
可是却不会呼叫建构式
所以觉得很奇怪,感觉不像结束後全部回收
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 140.113.67.159
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1477754816.A.64A.html
1F:推 kwpn: 呼叫fun完不会解构b1啊 10/29 23:47
2F:→ descent: 你的 linked list 是自己写的还是用 std::list 10/30 00:22
3F:→ jobsdone: link list是我自己写的 10/30 00:38
4F:→ jobsdone: 那请问呼叫解构的东西是什麽呢 10/30 00:39
5F:→ ralts: 是main跑完才解构的 10/30 00:56
※ 编辑: jobsdone (140.113.67.159), 10/30/2016 01:13:24
6F:推 kwpn: 你可以建构时也列印 10/30 01:21
7F:→ jobsdone: 我试了 只会在生成b1时 呼叫建构式 10/30 01:26
8F:推 ilikekotomi: fun的回传会呼叫copy ctor 他删掉的不是你想的b1 10/30 01:31
10F:→ ilikekotomi: 他解构的不是你想的b1 10/30 01:35
11F:→ ilikekotomi: 这个情况解构的是回传的物件 10/30 01:37
12F:→ jobsdone: 所以link list的情形是我没有copy constructor导致复制 10/30 01:40
13F:→ jobsdone: 同一个地址 然後直接将同一个位置delete 所以结果错误 10/30 01:40
14F:→ jobsdone: 吗 10/30 01:40
15F:→ jobsdone: 然後顺便问一下copy constructor应该和重载=不一样吧? 10/30 01:45
16F:推 ilikekotomi: copy ctor没写的话 compiler会自动生成 10/30 01:45
17F:→ ilikekotomi: 但如果你的class内有pointer的时候要自己写 10/30 01:46
18F:→ ilikekotomi: 我想错误原因很有可能是你讲的情况 10/30 01:47
19F:→ ilikekotomi: 两个不一样没错 但内容一般应该是一样的 10/30 01:47
20F:→ ilikekotomi: class有pointer要重新分配记忆体在把内容复制到 10/30 01:49
21F:→ ilikekotomi: 新的位置上 =的写法可以google copy-and-swap 10/30 01:50
22F:→ jobsdone: 感谢 我明天试看看 10/30 01:50
23F:→ ilikekotomi: 这样copy ctor写好 =就会跟着写好了 10/30 01:51
24F:推 neigence: 可以研究一下=operator 会产生一个b1的copy 10/30 12:31