線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:838
推到 Plurk!
推到 Facebook!

delete 會自動判斷資料型態嗎?

答題得分者是:pwipwi
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-05-13 16:11:05 IP:220.139.xxx.xxx 未訂閱
new delete 雖然每天在用,但最近想到一個問題,如: TList 我們可以 new 一些物件放入,如果是同樣的物件,如 TMemoryStream則: 建構/使用/解構大致如下:
TList *MyList;
TForm1::TForm1
{
 MyList=new TList;
}
TForm1::Add()
{
  TMemoryStream *stm=new TMemoryStream;
  MyList->Add(stm);
}
TForm1::~TForm1
{
  for(int i=0;iCount;i  )
  {
    TMemoryStream *stm=(TMemoryStream *)MyList->Items[i];
    delete stm;
  }
  delete MyList;
}
平常我也都是這樣用的。 但解構的部分是否可以這樣
TForm1::~TForm1
{
  for(int i=0;iCount;i  )
  {
    delete MyList->Items[i];
  }
  delete MyList;
}
若是則:
TList *MyList;
TForm1::TForm1
{
 MyList=new TList;
}
TForm1::AddA()
{
  TMemoryStream *stm=new TMemoryStream;
  MyList->Add(stm);
}
TForm1::AddB()
{
  TMyClass *cls=new TMyClass;
  MyList->Add(cls);
}
TForm1::~TForm1
{
  for(int i=0;iCount;i  )
  {
    delete MyList->Items[i];
  }
  delete MyList;
}
可以這樣嗎? 沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
Windyboy
版主


發表:7
回覆:119
積分:210
註冊:2002-11-07

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-05-13 17:09:23 IP:61.222.xxx.xxx 未訂閱
Hi dllee:      我做了個小實驗, 發現如果這樣用    delete MyList->Items[i];    是不會把記錄在MyList內的資料消除,    只有用    delete (TMemoryStream*)MyList->Items[i]    才會將該物件從memory中消除,    所以, 我想MyList->Items[i]內    只是記錄著"連結"到物件位址的位址,    不知道這樣講會不會不知道我在說什麼, ^_^ -------------------------- ~天下本無事 庸人自擾之~
pwipwi
版主


發表:68
回覆:629
積分:349
註冊:2004-04-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-05-13 17:31:18 IP:211.76.xxx.xxx 未訂閱
引言:
TList *MyList;
TForm1::TForm1
{
 MyList=new TList;
}
TForm1::AddA()
{
  TMemoryStream *stm=new TMemoryStream;
  MyList->Add(stm);
}
TForm1::AddB()
{
  TMyClass *cls=new TMyClass;
  MyList->Add(cls);
}
TForm1::~TForm1
{
  for(int i=0;iCount;i  )
  {
    delete MyList->Items[i];
  }
  delete MyList;
}
可以這樣嗎?
dllee你好: 這樣的結果應該是不行的。 delete的動作包含了呼叫destructor和使用operator delete 第一步要呼叫destructor時,就會出錯了。 因為void指標無法完成virtual所需要的動作。 (不過operator delete倒是可以接受void指標。) 要是用
delete dynamic_cast(MyList->Items[i]);
 
delete其base class指標理論上應該就可行了~ 不過我沒測式過... 發表人 - pwipwi 於 2004/05/13 17:32:55
hao_chih
一般會員


發表:15
回覆:25
積分:18
註冊:2003-09-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-05-14 09:22:24 IP:61.63.xxx.xxx 未訂閱
關於TList的刪除指標物件的方法, 他有提供一個函式,只是使用上不習慣而已 Oceans->Remove(O); delete O;    請參考這篇文章,裡頭有詳細的說明 【問題】請教 href="http://delphi.ktop.com.tw/topic.php?topic_id=34594">http://delphi.ktop.com.tw/topic.php?topic_id=34594
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-05-14 18:37:20 IP:220.139.xxx.xxx 未訂閱
由 axsoft 大大所提到的 http://www.bytamin-c.com/articles/Tlvist.htm 指出,還是需要指定型別才行。 而我用的別人的元件是可以「自己」幫我delete,而我來本以為它是騙人的,後來寫了個自己的元件放入其 List 內,在不用時,真的會叫到我自定的解構元,這表示,系統運作要如同 pwipwi 的說法才能達到。    沒空更新的網頁... http://dllee.ktop.com.tw C及指標教學,計算機概論,資訊管理導論... http://dllee.adsldns.org 介紹Shells,LiteStep,GeoShell....
------
http://www.ViewMove.com
系統時間:2024-07-01 6:33:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!