<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>OpenLayer memory leak?</title>
		<link>http://www.allegro.cc/forums/view/587890</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 07 Oct 2006 00:02:35 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe I&#39;m missing something, but here is the upload_texture routine from OpenLayer:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>OlTextureInfo AllegroGLDriver::</td></tr><tr><td class="number">2</td><td>UploadTexture<span class="k2">(</span> OL_MEMORY_IMG <span class="k3">*</span>bmp, <span class="k1">bool</span> isSolid <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>   isSolid <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>   <span class="k1">bool</span> useTemp <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>   </td></tr><tr><td class="number">6</td><td>   <span class="k1">int</span> bmpW <span class="k3">=</span> bmp-&gt;w<span class="k2">;</span></td></tr><tr><td class="number">7</td><td>   <span class="k1">int</span> bmpH <span class="k3">=</span> bmp-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>   </td></tr><tr><td class="number">9</td><td>   <span class="k1">int</span> textureW <span class="k3">=</span> bmpW<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>   <span class="k1">int</span> textureH <span class="k3">=</span> bmpH<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>   </td></tr><tr><td class="number">12</td><td>   <span class="k1">bool</span> useExtendedDimensions <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>   </td></tr><tr><td class="number">14</td><td>   <span class="k1">if</span><span class="k2">(</span> <span class="k3">!</span>IsExtensionAlvailable<span class="k2">(</span> TEXTURE_NOT_POWER_OF_TWO_EXT <span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">15</td><td>      <span class="k1">int</span> bmpW <span class="k3">=</span> bmp-&gt;w<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>      <span class="k1">int</span> bmpH <span class="k3">=</span> bmp-&gt;h<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>      </td></tr><tr><td class="number">18</td><td>      textureW <span class="k3">=</span> ToNextPowOfTwo<span class="k2">(</span> bmpW <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>      textureH <span class="k3">=</span> ToNextPowOfTwo<span class="k2">(</span> bmpH <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>      </td></tr><tr><td class="number">21</td><td>      useExtendedDimensions <span class="k3">=</span> textureW <span class="k3">!</span><span class="k3">=</span> bmpW <span class="k3">|</span><span class="k3">|</span> textureH <span class="k3">!</span><span class="k3">=</span> bmpH<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">23</td><td>   </td></tr><tr><td class="number">24</td><td>   <span class="k1">int</span> format <span class="k3">=</span> isSolid? GL_RGB <span class="k2">:</span> GL_RGBA<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>   <span class="k1">int</span> bpp <span class="k3">=</span> isSolid? <span class="n">3</span> <span class="k2">:</span> <span class="n">4</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>   <span class="c">/*</span></td></tr><tr><td class="number">27</td><td><span class="c">   unsigned char *data = new unsigned char[textureW * textureH * bpp];</span></td></tr><tr><td class="number">28</td><td><span class="c">   unsigned char *pixelPtr = data;</span></td></tr><tr><td class="number">29</td><td><span class="c">   */</span></td></tr><tr><td class="number">30</td><td>   </td></tr><tr><td class="number">31</td><td>   <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>data <span class="k3">=</span> <span class="k1">new</span> <span class="k1">unsigned</span> <span class="k1">char</span><span class="k2">[</span>textureW <span class="k3">*</span> textureH <span class="k3">*</span> bpp<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>   <span class="c">//float *data = new float[textureW * textureH * bpp];</span></td></tr><tr><td class="number">33</td><td>   </td></tr><tr><td class="number">34</td><td>   <span class="k1">char</span> buffer<span class="k2">[</span><span class="n">100</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>   </td></tr><tr><td class="number">36</td><td>   <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>imageStart <span class="k3">=</span> data <span class="k3">+</span> bpp <span class="k3">*</span> <span class="k2">(</span>textureH <span class="k3">-</span> bmpH<span class="k2">)</span> <span class="k3">*</span> textureW<span class="k2">;</span></td></tr><tr><td class="number">37</td><td>   <span class="k1">unsigned</span> <span class="k1">char</span> <span class="k3">*</span>pixelPtr <span class="k3">=</span> imageStart<span class="k2">;</span></td></tr><tr><td class="number">38</td><td>   <span class="k1">for</span><span class="k2">(</span> <span class="k1">int</span> y <span class="k3">=</span> bmpH-1<span class="k2">;</span> y <span class="k3">&gt;</span><span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y-- <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">39</td><td>      <span class="k1">for</span><span class="k2">(</span> <span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> bmpW<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">40</td><td>         <span class="k1">int</span> color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span> bmp, x, y <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">41</td><td>         ExtractColor<span class="k2">(</span> pixelPtr, color, format <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">43</td><td>      </td></tr><tr><td class="number">44</td><td>      pixelPtr <span class="k3">+</span><span class="k3">=</span> bpp <span class="k3">*</span> <span class="k2">(</span>textureW <span class="k3">-</span> bmpW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">46</td><td>   </td></tr><tr><td class="number">47</td><td>   <span class="k1">if</span><span class="k2">(</span> useExtendedDimensions <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">48</td><td>      <span class="k1">int</span> lastLine <span class="k3">=</span> bmpH <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      pixelPtr <span class="k3">=</span> imageStart <span class="k3">-</span> bpp <span class="k3">*</span> textureW<span class="k2">;</span></td></tr><tr><td class="number">50</td><td>      <span class="k1">for</span><span class="k2">(</span> <span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> bmpW<span class="k3">+</span><span class="n">1</span><span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">51</td><td>         <span class="k1">int</span> color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span> bmp, x, lastLine <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>         ExtractColor<span class="k2">(</span> pixelPtr, color, format <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">54</td><td>      </td></tr><tr><td class="number">55</td><td>      <span class="k1">for</span><span class="k2">(</span> <span class="k1">int</span> y <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> y <span class="k3">&lt;</span> bmpH<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span> <span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>         <span class="k1">int</span> color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span> bmp, bmpW-1, y <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>         pixelPtr <span class="k3">=</span> imageStart <span class="k3">+</span> bpp <span class="k3">*</span> <span class="k2">(</span>y <span class="k3">*</span> textureW <span class="k3">+</span> bmpW<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td>         ExtractColor<span class="k2">(</span> pixelPtr, color, format <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">60</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">61</td><td>   </td></tr><tr><td class="number">62</td><td>   OlTextureInfo textureInfo<span class="k2">(</span> textureW, textureH, bmp-&gt;w, bmp-&gt;h, format <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">63</td><td>   </td></tr><tr><td class="number">64</td><td>   GLuint <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td>   glGenTextures<span class="k2">(</span> <span class="n">1</span>, <span class="k3">&amp;</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">66</td><td>   glBindTexture<span class="k2">(</span> GL_TEXTURE_2D, <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">67</td><td>   </td></tr><tr><td class="number">68</td><td>   glTexEnvf<span class="k2">(</span> GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>   </td></tr><tr><td class="number">70</td><td>   glTexParameterf<span class="k2">(</span> GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,</td></tr><tr><td class="number">71</td><td>                    GL_LINEAR_MIPMAP_NEAREST <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">72</td><td>   </td></tr><tr><td class="number">73</td><td>   glTexParameterf<span class="k2">(</span> GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>   </td></tr><tr><td class="number">75</td><td>   glTexImage2D<span class="k2">(</span> GL_TEXTURE_2D, <span class="n">0</span>, bpp, textureW, textureH, <span class="n">0</span>, format, GL_UNSIGNED_BYTE, data <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>   </td></tr><tr><td class="number">77</td><td>   <span class="c">/*glTexImage2D( GL_TEXTURE_2D, 0, 4, textureInfo.texWidth, textureInfo.texHeight,</span></td></tr><tr><td class="number">78</td><td><span class="c">                 0, GL_RGBA, GL_UNSIGNED_BYTE, data );*/</span></td></tr><tr><td class="number">79</td><td>   textureInfo.SetIndex<span class="k2">(</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>   </td></tr><tr><td class="number">81</td><td>   <span class="k1">return</span> textureInfo<span class="k2">;</span></td></tr><tr><td class="number">82</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Two things:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">char</span> buffer<span class="k2">[</span><span class="n">100</span><span class="k2">]</span><span class="k2">;</span>
</pre></div></div><p>
Is not used as far as I can see, but more importantly the malloced &#39;data&#39; array is not freed at the end of the function. This data shouldn&#39;t still be needed in memory as this array is separate to the memory bitmap copy.</p><p>Unless I&#39;m missing something?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Thu, 05 Oct 2006 23:06:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The buffer is on the stack, and therefore cannot be leaked (assuming the function returns sometime...).  </p><p>The newed data array does appear to never be deleted.  I believe that&#39;s a leak.  At least, comparing it to other source code that calls glTexImage2D, like NeHe tutorial 06, I see that NeHe frees the memory it passes to glTexImage2D shortly after that call, whereas this code appears to let all pointers at the memory get lost.  <br />edit: &quot;points&quot; -&gt; &quot;pointers&quot; (typo)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (orz)</author>
		<pubDate>Thu, 05 Oct 2006 23:43:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Yep, buffer is on the stack, but it&#39;s not used so can be removed.</p><p>Yes, I imagine that the GlTexImage2D takes the data in the formats described and creates a version in video memory. So, the memory data passed can be freed.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Thu, 05 Oct 2006 23:49:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for noticing, I&#39;ve got it fixed now <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Fri, 06 Oct 2006 00:06:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Cool.</p><p>When can we see an official new release Fladimir? I think v2.0 is getting a bit old now. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Fri, 06 Oct 2006 00:19:05 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>As soon as his Rectangular TextRenderer Poly is working <img src="http://www.allegro.cc/forums/smileys/cool.gif" alt="8-)" /></p><p><img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Epsi)</author>
		<pubDate>Fri, 06 Oct 2006 23:01:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
I&#39;d like to see an new easy to compile version please. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Sat, 07 Oct 2006 00:02:35 +0000</pubDate>
	</item>
</rss>
