作者aquatear (米蟲)
看板C_and_CPP
標題[問題] 問一個物件相加 operator+ 的問題....
時間Fri May 15 10:49:29 2009
寫了一個重載 + 號 的函式 , 目的是將兩個 CWin 物件相加,
此物件是一個視窗, 相加結果是取視窗最大的寬高當作新視窗的寬高,
然後把新視窗的 title 設為 "new win"
CWin operator+(CWin &w)
{
int width,height;
width = this->width > w.width ? this->width: w.width;
height = this->height > w.height ? this->height : w.height;
return CWin(100,width,height,"new win");
}
CWin 的內容
class CWin
{
private:
int id;
int width;
int height;
char *title;
...
};
在 main 裡頭
win3 = win1+win2;
問題來了
我寫了一個解構函式
~CWin()
{
cout<<"win"<<id<<" was destructed! \n";
delete [] title;
system("pause");
}
跑完 operator+ 後
這行 return CWin(100,width,height,"new win")
這個 CWin 新視窗會隨著函式結束呼叫解構而被銷毀
title 這塊記憶體會被釋放, 但是如果不釋放, 會造成 memory leak
請問到底該怎麼寫....
才不會 memory leak , win3 又可以在 operator+ 裡 設定新 title ... ??
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.219.68.170
※ 編輯: aquatear 來自: 61.219.68.170 (05/15 10:51)
1F:推 legnaleurc:先看operator =有沒有正確實作 05/15 11:00
2F:→ legnaleurc:否則就把title改成std::string 05/15 11:00
3F:→ aquatear:operator= 有沒有實做跟這個問題比較無關 05/15 11:16
4F:→ aquatear:因為跑完 operator+後, title 就已經被銷毀 05/15 11:17
5F:推 littleshan:你的 ctor 要為 title 配置記憶體並且複製參數 05/15 11:46
6F:→ littleshan:否則 delete 時會試圖釋放 string literal 導致錯誤 05/15 11:47
7F:→ littleshan:operator= 還有 copy constructor 也都是要注意的地方 05/15 11:47
8F:→ littleshan:這些問題,只要你改用 std::string 就可以一次解決 05/15 11:48
9F:→ aquatear:為什麼 std::string 可以解決呢 ? 解構函式不會去 delete 05/15 13:30
10F:→ aquatear:他嗎? 05/15 13:30
11F:推 legnaleurc:重點不是它會不會解構,而是被解構前有沒有被正常複製 05/15 13:59
12F:推 jerohands:string是STL容器之一,然而STL接近無敵啊XD 05/15 14:16
13F:→ dove1706:big three問題找過書嗎,這裡問會很片斷 05/16 06:38