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

TClientSocket & TServerSocket在delete時 出現error

答題得分者是:jow
falldog7
一般會員


發表:12
回覆:16
積分:5
註冊:2007-08-30

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-04-17 23:40:45 IP:124.10.xxx.xxx 訂閱
我的程式是在Form Create時
用new的方式create出TClientSocket & TServerSocket的

因此,在Form Destroy時
想用delete的方式,將TClientSocket & TServerSocket的memory刪除
但是卻會出現Error!!!

Access violation at address 00000000.

有人知道為什麼嗎??? @@"""
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-04-19 01:50:43 IP:122.118.xxx.xxx 未訂閱
應該是你還沒做 disconnect 就做 delete 的問題吧。
falldog7
一般會員


發表:12
回覆:16
積分:5
註冊:2007-08-30

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-04-19 09:19:19 IP:124.10.xxx.xxx 訂閱
我貼一下我的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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-04-19 12:04:32 IP:123.193.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-04-19 17:52:38 IP:124.10.xxx.xxx 訂閱
喔~ 
所以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,
它依然指向一個已經被釋放的物件.......


個人看法僅供參考...........

系統時間:2024-03-28 20:46:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!