TClientSocket & TServerSocket在delete時 出現error |
答題得分者是:jow
|
falldog7
一般會員 發表:12 回覆:16 積分:5 註冊:2007-08-30 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
|
falldog7
一般會員 發表:12 回覆:16 積分:5 註冊:2007-08-30 發送簡訊給我 |
我貼一下我的code好了
我在Form的Constructor中new出一個TClientSocket並讓它的Active為false 如果在FormDestroy中delete的話 會出現Error 如果在FormClose中delete的話 卻會成功 為什麼??? Unit1.h [code cpp] //--------------------------------------------------------------------------- #ifndef Unit1H #define Unit1H //--------------------------------------------------------------------------- #include #include #include #include <Forms.hpp><br />#include //--------------------------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components void __fastcall FormDestroy(TObject *Sender); void __fastcall FormClose(TObject *Sender, TCloseAction &Action); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); TClientSocket * mClient; }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endif [/code] Unit1.cpp [code cpp] //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { mClient = new TClientSocket(Owner); mClient->Active = false; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { delete mClient; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { // delete mClient; } //--------------------------------------------------------------------------- [/code] |
jow
尊榮會員 發表:66 回覆:751 積分:1253 註冊:2002-03-13 發送簡訊給我 |
mClient = new TClientSocket(Owner);
因為mClient的Owner是TForm1, 所以在FormDestroy 時 TForm1會負責釋放mClient, 所以即使不做delete mClient 這個動作也可以. 在OnFormDestroy()來做delete mClient有時會有問題, 可能因為TForm1在釋放其所管理的Owned Component時 順序的問題,也就是說實際的TClientSocket instance已經釋放 可是原先指向該instance的物件指標(mClient), 並沒有被設為nil, 它依然指向一個已經被釋放的物件....... 個人看法僅供參考...........
編輯記錄
jow 重新編輯於 2008-04-19 12:05:04, 註解 無‧
|
falldog7
一般會員 發表:12 回覆:16 積分:5 註冊:2007-08-30 發送簡訊給我 |
喔~
所以TForm1會負責釋放其所管理的Owned Component囉!? 我不知道BCB有做得這麼徹底的事耶 真是受教了~ 感謝~ ===================引 用 jow 文 章=================== mClient = new TClientSocket(Owner); 因為mClient的Owner是TForm1, 所以在FormDestroy 時 TForm1會負責釋放mClient, 所以即使不做delete mClient 這個動作也可以. 在OnFormDestroy()來做delete mClient有時會有問題, 可能因為TForm1在釋放其所管理的Owned Component時 順序的問題,也就是說實際的TClientSocket instance已經釋放 可是原先指向該instance的物件指標(mClient), 並沒有被設為nil, 它依然指向一個已經被釋放的物件....... 個人看法僅供參考........... |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |