<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<TITLE>Message</TITLE>

<META content="MSHTML 6.00.2800.1226" name=GENERATOR></HEAD>
<BODY>
<DIV><FONT face=Arial size=2><SPAN 
class=348032504-28092003>Frank,</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2><SPAN 
class=348032504-28092003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><SPAN class=348032504-28092003>&nbsp; I ran across 
several memory leaks in ogrfeaturestyle.cpp</SPAN></FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>with a large input 
file and querying the feature style string I was</FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>getting several 
thousand memory leaks.</FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>The problem was in 
two places, first in <FONT 
size=2>CreateStyleToolFromStyleString</FONT></FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>it was not calling 
CSLDestroy(papszToken);</FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>Then in the 
destructors of <FONT size=2>OGRStyleTool subclasses they 
were</FONT></FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>only calling <FONT 
size=2>CPLFree(m_pasStyleValue);</FONT></FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial 
size=2></FONT></SPAN>&nbsp;</DIV>
<DIV><SPAN class=348032504-28092003><FONT face=Arial size=2>The problem with 
this is m_pasStyleValue is a vector like class of</FONT></SPAN></DIV>
<DIV><SPAN class=348032504-28092003></SPAN><SPAN class=348032504-28092003><FONT 
size=2>several OGRStyleValue's.&nbsp; Inside <FONT size=2>OGRStyleValue can be a 
pointer to a</FONT></FONT></SPAN></DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003>heap allocated string in 
</SPAN><SPAN class=348032504-28092003>pszValue, which was the 
leak.</SPAN></FONT></DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003><FONT face=Arial>Below are the 
changes that fixed these leaks.</FONT></SPAN></FONT></DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003><FONT 
face=Arial></FONT></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003><FONT 
face=Arial>Thanks</FONT></SPAN></FONT></DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003><FONT 
face=Arial></FONT></SPAN></FONT>&nbsp;</DIV>
<DIV><FONT size=2><SPAN class=348032504-28092003><FONT face=Arial>Steve 
Brooks</FONT></DIV></SPAN></FONT>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>$ diff&nbsp;<SPAN 
class=348032504-28092003>clean</SPAN>/gdal/ogr/ogrfeaturestyle.cpp <SPAN 
class=348032504-28092003>modified</SPAN>/gdal/ogr/ogrfeaturestyle.cpp<BR>432a433<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
OGRStyleTool *poStyleTool = 
NULL;<BR>434,447c435,447<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; if 
(CSLCount(papszToken) &lt;2)<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
NULL;<BR>&lt;<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; if 
(EQUAL(papszToken[0],"PEN"))<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
new OGRStylePen();<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; else if 
(EQUAL(papszToken[0],"BRUSH"))<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
return new OGRStyleBrush();<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; else if 
(EQUAL(papszToken[0],"SYMBOL"))<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
return new OGRStyleSymbol();<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; else if 
(EQUAL(papszToken[0],"LABEL"))<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
return new OGRStyleLabel();<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; 
else<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
NULL;<BR>&lt;<BR>---<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; if (CSLCount(papszToken) 
&gt;= 2)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
(EQUAL(papszToken[0],"PEN"))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
poStyleTool = new OGRStylePen();<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else if 
(EQUAL(papszToken[0],"BRUSH"))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
poStyleTool = new OGRStyleBrush();<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else if 
(EQUAL(papszToken[0],"SYMBOL"))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
poStyleTool = new OGRStyleSymbol();<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
else if 
(EQUAL(papszToken[0],"LABEL"))<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
poStyleTool = new OGRStyleLabel();<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
CSLDestroy(papszToken);<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; return 
poStyleTool;<BR>1394a1395,1402<BR>&gt;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 
OGRSTPenLast; i++)<BR>&gt;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_pasStyleValue[i].pszValue != 
NULL)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
CPLFree(m_pasStyleValue[i].pszValue);<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pasStyleValue[i].pszValue = NULL;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&gt;&nbsp;&nbsp;&nbsp; }<BR>1414a1423,1430<BR>&gt;&nbsp;&nbsp;&nbsp; for 
(int i = 0; i &lt; OGRSTBrushLast; i++)<BR>&gt;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_pasStyleValue[i].pszValue != 
NULL)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
CPLFree(m_pasStyleValue[i].pszValue);<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pasStyleValue[i].pszValue = NULL;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&gt;&nbsp;&nbsp;&nbsp; }<BR>1434a1451,1458<BR>&gt;&nbsp;&nbsp;&nbsp; for 
(int i = 0; i &lt; OGRSTSymbolLast; i++)<BR>&gt;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (m_pasStyleValue[i].pszValue != 
NULL)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
CPLFree(m_pasStyleValue[i].pszValue);<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pasStyleValue[i].pszValue = NULL;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&gt;&nbsp;&nbsp;&nbsp; 
}<BR>1455,1456c1479,1490<BR>&lt;&nbsp;&nbsp;&nbsp;&nbsp; 
CPLFree(m_pasStyleValue);<BR>&lt;<BR>---<BR>&gt;&nbsp;&nbsp;&nbsp; if 
(m_pasStyleValue != NULL)<BR>&gt;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; 
OGRSTLabelLast; i++)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
(m_pasStyleValue[i].pszValue != 
NULL)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
{<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
CPLFree(m_pasStyleValue[i].pszValue);<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
m_pasStyleValue[i].pszValue = 
NULL;<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
}<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<BR>&gt;&nbsp;&nbsp;&nbsp; 
}<BR>&gt;&nbsp;&nbsp;&nbsp; CPLFree(m_pasStyleValue);</FONT></DIV>
<DIV>&nbsp;</DIV></BODY></HTML>