<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Spot the Memory Leak (right forum this time)</title>
		<link>http://www.allegro.cc/forums/view/591640</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 30 May 2007 16:38:08 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m using Wu Yongwei&#39;s debug_new.cpp to try to root out memory leaks in my current project, and I seem to have them all except for one.</p><p>Here&#39;s where the code is allocated:</p><div class="source-code snippet"><div class="inner"><pre>Players<span class="k2">[</span>iCurrentPlayer<span class="k2">]</span>.sprAnim <span class="k3">=</span> <span class="k1">new</span> <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k3">*</span><span class="k2">[</span>Players<span class="k2">[</span>iCurrentPlayer<span class="k2">]</span>.iAnimSteps<span class="k2">]</span><span class="k2">;</span>
<span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> Players<span class="k2">[</span>iCurrentPlayer<span class="k2">]</span>.iAnimSteps<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="k2">{</span>
  Players<span class="k2">[</span>iCurrentPlayer<span class="k2">]</span>.sprAnim<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="k1">new</span> <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k3">*</span><span class="k2">[</span><span class="n">6</span><span class="k2">]</span><span class="k2">;</span>
  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> <span class="n">6</span><span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
  <span class="k2">{</span>
    <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"Creating sprAnim[%i][%i]\n"</span>, i, j<span class="k2">)</span><span class="k2">;</span>
    Players<span class="k2">[</span>iCurrentPlayer<span class="k2">]</span>.sprAnim<span class="k3">&lt;</span>i&gt;<span class="k2">[</span>j<span class="k2">]</span> <span class="k3">=</span> <span class="k1">new</span> <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a><span class="k2">;</span> <span class="c">// THIS LINE CAUSES LEAKS</span>
  <span class="k2">}</span>
<span class="k2">}</span>
</pre></div></div><p>

And so on.  The line with the comment is the one always indicated by debug_new.  I have a struct called objPlayers (Players is a pointer to an array of objPlayers).  Here&#39;s the destructor:</p><div class="source-code snippet"><div class="inner"><pre>objPlayer::~objPlayer<span class="k2">(</span><span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> iAnimSteps<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
  <span class="k2">{</span>
    <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> <span class="n">6</span><span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
    <span class="k2">{</span>
      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"Destroying sprAnim[%i][%i]\n"</span>, i, j<span class="k2">)</span><span class="k2">;</span>
      <a href="http://www.allegro.cc/manual/destroy_bitmap" target="_blank"><span class="a">destroy_bitmap</span></a><span class="k2">(</span>sprAnim<span class="k3">&lt;</span>i&gt;<span class="k2">[</span>j<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>    
    <span class="k2">}</span>
    <span class="k1">delete</span><span class="k2">[</span><span class="k2">]</span> sprAnim<span class="k3">&lt;</span>i&gt;<span class="k2">;</span>
  <span class="k2">}</span>
  <span class="k1">delete</span><span class="k2">[</span><span class="k2">]</span> sprAnim<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

I&#39;m using Allegro 4.2.1 in Windows XP with the MinGW compiler (and MSYS environment).  I&#39;m testing with three frames of animation (frame 0, 1, and 2).  sprAnim should always be sprAnim[frame number][object number (0 through 5)].  Does anyone have some insight they could give me?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kcowolf)</author>
		<pubDate>Wed, 30 May 2007 09:39:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You create bitmaps with <span class="source-code"><a href="http://www.allegro.cc/manual/create_bitmap" target="_blank"><span class="a">create_bitmap</span></a></span> and not with <i>new</i>. The <i>destroy_bitmap</i> call is not freeing the memory because the structure was not created with <i>create_bitmap</i>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Wed, 30 May 2007 09:42:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It probably also has to do with the fact that Bitmap is a struct containing a pointer to the bitmap and not the bitmap itself. So new shouldn&#39;t actually allocate any memory.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Goalie Ca)</author>
		<pubDate>Wed, 30 May 2007 10:18:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Reybujo said:</div><div class="quote"><p>
You create bitmaps with</p><p>create_bitmap</p><p>and not with new. The destroy_bitmap call is not freeing the memory because the structure was not created with create_bitmap.
</p></div></div><p>

D&#39;oh!  That was the problem exactly.  I just took out that for (int = j) loop and it worked perfectly.  Thanks for the help!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kcowolf)</author>
		<pubDate>Wed, 30 May 2007 16:38:08 +0000</pubDate>
	</item>
</rss>
