[fpc-devel] Mem-leak, where?
Joost van der Sluis
joost at cnoc.nl
Wed Sep 26 00:46:32 CEST 2007
Op woensdag 26-09-2007 om 02:29 uur [tijdzone +0400], schreef Sergei
Gorelkin:
> Joost van der Sluis wrote:
> > ----
> > program testbug9751;
> >
> > {$mode objfpc}{$H+}
> >
> > uses
> > Classes, SysUtils, mysql41dyn;
> >
> > var hmysql : PMYSQL;
> >
> > begin
> > // InitialiseMysql; <-- remove the comment and the leakage is gone
> > repeat
> > InitialiseMysql;
> > hmysql := nil;
> > hmysql := mysql_init(hmysql);
> > // Comment the next line and the leakage is gone
> > HMySQL:=mysql_real_connect(HMySQL,PChar(''),PChar(''),Pchar(''),Nil,0,Nil,0);
> > mysql_close(hmysql);
> > ReleaseMysql;
> > until 1<0;
> > end.
> > ----
>
> Looks like mysql_real_connect() overwrites hmysql variable? The value
> returned by mysql_init() is not passed to mysql_close(), and the library
> may not unload in this case.
> If you comment mysql_real_connect(), handle returned by mysql_init() IS
> passed to mysql_close().
I also thought that. But that's not the case. From the
mysql-documentation:
(http://dev.mysql.com/doc/refman/5.0/en/mysql-real-connect.html)
----
Return Values
A MYSQL* connection handle if the connection was successful, NULL if the
connection was unsuccessful. For a successful connection, the return
value is the same as the value of the first parameter.
----
Also in the case of a succesfull connection, this code leaks...
I've rewritten the code, so that it's more clear what happens:
-----
program testbug9751;
{$mode objfpc}{$H+}
uses
Classes, SysUtils, mysql41dyn,dynlibs;
var hmysql : PMYSQL;
LH : TLibHandle;
begin
repeat // repeat here gives troubles
LH := loadlibrary(mysqllib);
pointer(mysql_init) := GetProcedureAddress(LH,'mysql_init');
pointer(mysql_real_connect) := GetProcedureAddress(LH,'mysql_real_connect');
pointer(mysql_close) := GetProcedureAddress(LH,'mysql_close');
// repeat; <- if the repeat is placed here, the problems are gone
hmysql := nil;
hmysql := mysql_init(hmysql);
// Remove the next line and the problem is gone.
HMySQL:=mysql_real_connect(HMySQL,PChar('192.168.3.1'),PChar('root'),Pchar('rosivrepus'),Nil,0,Nil,0);
mysql_close(hmysql);
// until 1<0; <- if the until is placed here, the problems are gone
UnloadLibrary(LH);
until 1<0; // until here gives troubles
end.
-----
so you can solve the leak by two ways:
1: remove the mysql_real_connect
2: move the repeat-until so that the 'initialisation' is outside the
loop
Joost.
More information about the fpc-devel
mailing list