如何动态创建和释放Socket (100分)

  • 主题发起人 主题发起人 niuqi31
  • 开始时间 开始时间
N

niuqi31

Unregistered / Unconfirmed
GUEST, unregistred user!
程序中使用了动态创建的Socket,使用起来没有问题。但在程序运行态时释放时却释放不掉。即ClientSocket1!=NULL。很奇怪?求解。
void TForm1::CreateClientSocket(AnsiString HostAddress,int HostPort)
{
ClientSocket1=new TClientSocket(this);
ClientSocket1->Address=HostAddress;
ClientSocket1->Port=HostPort;
ClientSocket1->OnConnect=ClientSocket1Connect;
ClientSocket1->OnDisconnect=ClientSocket1Disconnect;
ClientSocket1->OnRead=ClientSocket1Read;
ClientSocket1->OnError=ClientSocket1Error;
ClientSocket1->Active=true;
}
void TForm1::FreeClientSocket(void) //释放客户端socket
{
ClientSocket1->Active=false;
ClientSocket1->DestroyComponents();
//ClientSocket1=NULL;
}
ClientSocket1 为类的全局指针。
 
你试试其他控件看看DestroyComponents();后是否为NULL。
 
首先 DestroyComponents 只是释放以它为 OWner 的控件,并不能释放自己;

另外作为一个一般概念,我想你应该清楚:
一般的成员函数即使是析构,只是释放指针所指向的内存,并不会将该指针置为 NULL;
之后,指针的值就是无意义的,为避免错误使用它,应该手工设其为 NULL,
以便在下次使用它的时候可以根据该它是否为 NULL 来判断该指针是否有意义;
 
请教cqbaobao
void TForm1::FreeClientSocket(void) //释放客户端socket
{
ClientSocket1->Active=false;
ClientSocket1->DestroyComponents();
ClientSocket1=NULL;《--加了这句
}
我在程序运行的时候,不停的创建和释放ClientSocket,我发现内存不停在增加。为什么?
 
SendSocket.Close;
SendSocket.free;
 
SendSocket := TClientSocket.Create(Application);
 
倒,我说了半天,原来最关键的没说:(

你应该如下:
void TForm1::FreeClientSocket(void) //释放客户端socket
{
ClientSocket1->Active=false;
ClientSocket1->Close();
ClientSocket1->Free();
ClientSocket1 = NULL; // 注意:这一句只是为了下次使用的时候不会有误会
}
 
ClientSocket1->Active=false;
ClientSocket1->Close();
请问两句话不一样吗?我觉得是一样的?请教。
 
to cqbaobao :
void TForm1::FreeClientSocket(void) //释放客户端socket
{
ClientSocket1->Active=false;
ClientSocket1->Close();
ClientSocket1->Free();
ClientSocket1 = NULL; // 注意:这一句只是为了下次使用的时候不会有误会
}
用了你的函数,内存还是递增呀。

to okgxsh
SendSocket := TClientSocket.Create(Application);
用了你的函数,内存还是递增呀。
 
我是针对你的 "DestroyComponents" 和 "指针 = NULL" 这两个地方而说,

并且我也不熟悉 BCB 的语法,我只知道 C++ 里 new 一个对象,
对应的应该是 delete ,上述代码里的 Free 我不太清楚是否合适;

如果上述的 Free 和 delete 是等价的,
仅从 CreateClientSocket 和 FreeClientSocket 两个过程来看,
我认为不会造成内存泄露,你可以检查一下别的代码,
或者去掉别的代码,仅反复调用这两个过程,看是否会泄露。

并且在 CreateClientSocket 的第一句,宜加上一句:
if (ClientSocket1 != NULL) return;
 
接受答案了.
 
后退
顶部