Solved

Quick check on dynamic array deprecation and any resulting memory leaks

Posted on 2008-06-20
4
276 Views
Last Modified: 2010-04-05
A little information on how this program works:

Main winsock component waits for new connections.
When a new connection arrives it takes the dynamic  array holding all the connections and sets the length to one larger.(I.E. SetLength(ServerClients,TotalConnections + 1)). In the new space allocolated it creates a new winsock object to take the connections.(Shown below).

Now when the connection is closed I FreeAndNil() that spot in the dynamic array. So you may have (con1,con2,nil,con4). What I have done(also shown below) is first take the nil out of the array by moving the next one in the array down. You would then have (con1, con2, con4, con4). I then reset all tags and information to reorder the array to (con1, con2, con3, con4). Now that con4 isn't necessary I set the length down one.

Now I thought I would have to put a FreeAndNil() for the con4 but that just gives me errors. It works without it but I wonder if I'm leaking memory this way.

Any suggestions on how this could be done differently? Or if it's fine as it is?
procedure TForm1.Winsock1ConnectionRequest(ASender: TObject;

  requestID: Integer);

var

  CurrentClient : TClientWinsock;

begin

  Inc(TotalClients);

  SetLength(ServerClients,TotalClients);

  ServerClients[TotalClients - 1] := TClientWinsock.Create(Winsock1);

  CurrentClient := ServerClients[TotalClients - 1];

  CurrentClient.LocalPort := LocalPort;

  CurrentClient.Tag := TotalClients - 1;

  CurrentClient.Ping := 0;

  CurrentClient.IdleTime := 0;

  CurrentClient.CurrentUser := '';

  CurrentClient.ActiveWindow := '';

  CurrentClient.OnDataArrival := WinsockDataArrival;

  CurrentClient.OnClose := WinsockClose;

  CurrentClient.OnError := WinsockError;

  CurrentClient.Close;

  CurrentClient.Accept(requestID);

end;
 
 

procedure TForm1.WinsockClose(Sender: TObject);

var

  I,J,Max : Integer;

  CurrentClient : TClientWinsock;

begin

  CurrentClient := (Sender as TClientWinsock);

  CurrentClient.Close;

  J := CurrentClient.Tag;

  ComboBox1.Items.Clear;

  FreeAndNil(ServerClients[J]);

  Dec(TotalClients);

  For I := J To High(ServerClients) Do

    begin

    If I = High(ServerClients) Then

      begin

      SetLength(ServerClients,TotalClients);

      Break;

    end;

    ServerClients[I] := ServerClients[I + 1];

    //FreeAndNil(ServerClients[I + 1]);

    ServerClients[I].Tag := ServerClients[I].Tag - 1;

  end;

  For I := Low(ServerClients) To High(ServerClients) Do

    begin

    ComboBox1.Items.AddObject(ServerClients[I].RemoteHostIP,TObject(ServerClients[I].Tag));

  end;

  Panel2.Caption := '';

  Panel3.Caption := '';

  Panel4.Caption := '';

  Panel5.Caption := '';

  Panel6.Caption := '';

end;

Open in new window

0
Comment
Question by:ThievingSix
  • 2
4 Comments
 
LVL 10

Assisted Solution

by:dinilud
dinilud earned 50 total points
ID: 21836400
i think , there is no memory leak.

you can check this with 'EurekaLog' or 'FastMM'
0
 
LVL 36

Assisted Solution

by:Geert Gruwez
Geert Gruwez earned 50 total points
ID: 21836573
why don't you use a TCollection with a descendant of TCollectionItem ?
0
 
LVL 2

Accepted Solution

by:
Ustin19 earned 400 total points
ID: 21837195
dinilud is on point: it is no memory leaks
(con1, con2, con3, con4) - is pointers to objects, when (con1, con2, con4, con4) reduces to (con1, con2, con4) pointer to con4 stores in element [2] and all right.
Error appears when you freeandnil con4 (!) at first step of loop and then use it's method ServerClients[I].Tag at next iteration :)
0
 
LVL 36

Expert Comment

by:Geert Gruwez
ID: 21837262
saves all the hassle with using a collection
no need to reorder
0

Featured Post

Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

Join & Write a Comment

A lot of questions regard threads in Delphi.   One of the more specific questions is how to show progress of the thread.   Updating a progressbar from inside a thread is a mistake. A solution to this would be to send a synchronized message to the…
Introduction Raise your hands if you were as upset with FireMonkey as I was when I discovered that there was no TListview.  I use TListView in almost all of my applications I've written, and I was not going to compromise by resorting to TStringGrid…
Internet Business Fax to Email Made Easy - With eFax Corporate (http://www.enterprise.efax.com), you'll receive a dedicated online fax number, which is used the same way as a typical analog fax number. You'll receive secure faxes in your email, fr…
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now