<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>working with char arrays: memory leak?</title>
		<link>http://www.allegro.cc/forums/view/589594</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Wed, 17 Jan 2007 03:11:50 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There must be something with char arrays that I am missing out on.<br />The procedure below had symptoms of memory overwrites. I have already rewrote it using allegro unicode routines. It works fine if compiled for release in MSVC, but I now notice it crashes when compiled in debug mode. The crash occurs right after this procedure has been run once. what is illegal here? how can I catch the overwrite or overread more specific? What statements do I have to make instead?<br />Thanks in advance.</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">// shortens a string to a specified length. This is done by adding the \0 limiter.</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> _setstrlen<span class="k2">(</span><span class="k1">char</span> <span class="k3">*</span>string, <span class="k1">int</span> length<span class="k2">)</span></td></tr><tr><td class="number">3</td><td><span class="k2">{</span></td></tr><tr><td class="number">4</td><td>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ustrlen" target="_blank"><span class="a">ustrlen</span></a><span class="k2">(</span>string<span class="k2">)</span><span class="k3">&gt;</span>length<span class="k2">)</span></td></tr><tr><td class="number">5</td><td>      <span class="k3">*</span><span class="k2">(</span>string <span class="k3">+</span> length<span class="k2">)</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td><span class="k2">}</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="p">#define strcpy2(dest, src)     ustrzcpy(dest,sizeof(dest), src)</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="c">// takes one long string and smartly cuts it into sentences given a width-limit. draws to scrbuf.</span></td></tr><tr><td class="number">11</td><td><span class="k1">int</span> draw_textblok<span class="k2">(</span><span class="k1">int</span> limit, <span class="k1">int</span> issue<span class="k2">)</span></td></tr><tr><td class="number">12</td><td><span class="k2">{</span></td></tr><tr><td class="number">13</td><td>  <span class="k1">char</span> linebuf<span class="k2">[</span><span class="n">801</span><span class="k2">]</span>,text<span class="k2">[</span><span class="n">801</span><span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <span class="k1">int</span>  lines<span class="k3">=</span><span class="n">0</span>,</td></tr><tr><td class="number">15</td><td>       pos<span class="k3">=</span><span class="n">0</span>,  <span class="c">// position in source text buffer</span></td></tr><tr><td class="number">16</td><td>       pos1<span class="k3">=</span><span class="n">0</span>, <span class="c">// position after lines already drawn</span></td></tr><tr><td class="number">17</td><td>       pos2,   <span class="c">// </span></td></tr><tr><td class="number">18</td><td>       pos3,   <span class="c">//</span></td></tr><tr><td class="number">19</td><td>       posmax<span class="k2">;</span> <span class="c">// size of source text buffer</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>  <span class="k1">const</span> <span class="k1">int</span>  lineh<span class="k3">=</span><a href="http://www.allegro.cc/manual/text_height" target="_blank"><span class="a">text_height</span></a><span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span><span class="k2">)</span>fntdat<span class="k2">[</span>FNT04<span class="k2">]</span>.dat<span class="k2">)</span><span class="k3">+</span><span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <span class="k1">if</span>  <span class="k2">(</span>limit<span class="k3">&lt;</span><span class="n">200</span><span class="k2">)</span> limit<span class="k3">=</span><span class="n">200</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>&#160;</td></tr><tr><td class="number">24</td><td>  strcpy2<span class="k2">(</span>text,qst.briefing<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>  posmax<span class="k3">=</span><a href="http://www.allegro.cc/manual/ustrlen" target="_blank"><span class="a">ustrlen</span></a><span class="k2">(</span>text<span class="k2">)</span><span class="k3">-</span><span class="n">1</span><span class="k2">;</span>  </td></tr><tr><td class="number">27</td><td>  </td></tr><tr><td class="number">28</td><td>  <span class="k1">while</span> <span class="k2">(</span>text<span class="k2">[</span>posmax<span class="k2">]</span><span class="k3">=</span><span class="k3">=</span><span class="s">' '</span><span class="k2">)</span> posmax--<span class="k2">;</span> <span class="c">// remove trailing spaces</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td>  <span class="k1">do</span></td></tr><tr><td class="number">31</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">32</td><td>    <span class="c">// find out when exceeding limit</span></td></tr><tr><td class="number">33</td><td>    <span class="k1">do</span></td></tr><tr><td class="number">34</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">35</td><td>      <a href="http://www.allegro.cc/manual/usetat" target="_blank"><span class="a">usetat</span></a><span class="k2">(</span>linebuf, pos-pos1, <a href="http://www.allegro.cc/manual/ugetat" target="_blank"><span class="a">ugetat</span></a><span class="k2">(</span>text, pos<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>  <span class="c">// linebuf[pos-pos1]=text[pos];</span></td></tr><tr><td class="number">36</td><td>      _setstrlen<span class="k2">(</span>linebuf,pos-pos1<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>                <span class="c">// linebuf[pos-pos1+1]=0; //endline</span></td></tr><tr><td class="number">37</td><td>      pos<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">38</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">39</td><td>    <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/text_length" target="_blank"><span class="a">text_length</span></a><span class="k2">(</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span><span class="k2">)</span>fntdat<span class="k2">[</span>FNT04<span class="k2">]</span>.dat,linebuf<span class="k2">)</span><span class="k3">&lt;</span><span class="k3">=</span>limit <span class="k3">&amp;</span><span class="k3">&amp;</span> pos<span class="k3">&lt;</span><span class="k3">=</span><span class="k2">(</span>posmax<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">40</td><td>&#160;</td></tr><tr><td class="number">41</td><td>    <span class="c">// take back to first space, compensate last c++</span></td></tr><tr><td class="number">42</td><td>    <span class="k1">do</span> pos--<span class="k2">;</span> <span class="k1">while</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ugetat" target="_blank"><span class="a">ugetat</span></a><span class="k2">(</span>linebuf,pos-pos1<span class="k2">)</span><span class="k3">!</span><span class="k3">=</span><span class="s">' '</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/ugetat" target="_blank"><span class="a">ugetat</span></a><span class="k2">(</span>linebuf,pos-pos1<span class="k2">)</span><span class="k3">!</span><span class="k3">=</span><span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> pos&gt;pos1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">43</td><td>&#160;</td></tr><tr><td class="number">44</td><td>    <span class="c">// search for nearby of end of a sentence, or part of a sentence:</span></td></tr><tr><td class="number">45</td><td>    pos3<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> pos2<span class="k3">=</span>pos<span class="k2">;</span></td></tr><tr><td class="number">46</td><td>    <span class="k1">if</span> <span class="k2">(</span>pos&gt;20<span class="k2">)</span> <span class="k1">do</span></td></tr><tr><td class="number">47</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">48</td><td>      <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ugetat" target="_blank"><span class="a">ugetat</span></a><span class="k2">(</span>linebuf,pos2-pos1<span class="k2">)</span><span class="k3">=</span><span class="k3">=</span><span class="s">','</span> <span class="k3">|</span><span class="k3">|</span> <a href="http://www.allegro.cc/manual/ugetat" target="_blank"><span class="a">ugetat</span></a><span class="k2">(</span>linebuf,pos2-pos1<span class="k2">)</span><span class="k3">=</span><span class="k3">=</span><span class="s">'.'</span><span class="k2">)</span> pos3<span class="k3">=</span>pos2<span class="k2">;</span></td></tr><tr><td class="number">49</td><td>      pos2--<span class="k2">;</span></td></tr><tr><td class="number">50</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">51</td><td>    <span class="k1">while</span> <span class="k2">(</span>pos2&gt;<span class="k2">(</span>pos-20<span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> pos3<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">52</td><td>    <span class="k1">if</span> <span class="k2">(</span>pos3&gt;0<span class="k2">)</span> pos<span class="k3">=</span>pos3<span class="k2">;</span></td></tr><tr><td class="number">53</td><td>    <span class="c">// put endline at place: </span></td></tr><tr><td class="number">54</td><td>    _setstrlen<span class="k2">(</span>linebuf,pos-pos1<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">55</td><td>    <span class="c">// remove heading spaces:</span></td></tr><tr><td class="number">56</td><td>    <span class="k1">if</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ugetc" target="_blank"><span class="a">ugetc</span></a><span class="k2">(</span>linebuf<span class="k2">)</span><span class="k3">=</span><span class="k3">=</span><span class="s">' '</span><span class="k2">)</span> <a href="http://www.allegro.cc/manual/uremove" target="_blank"><span class="a">uremove</span></a><span class="k2">(</span>linebuf,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">57</td><td>    <span class="c">// then write the string</span></td></tr><tr><td class="number">58</td><td>    <a href="http://www.allegro.cc/manual/textprintf_centre_ex" target="_blank"><span class="a">textprintf_centre_ex</span></a><span class="k2">(</span>scrbuf,<span class="k2">(</span><a href="http://www.allegro.cc/manual/FONT" target="_blank"><span class="a">FONT</span></a> <span class="k3">*</span><span class="k2">)</span>fntdat<span class="k2">[</span>FNT02<span class="k2">]</span>.dat,<span class="k2">(</span>limit<span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k3">+</span><span class="n">1</span>,lines<span class="k3">*</span>lineh,_col<span class="k2">(</span>ink<span class="k2">)</span>,<span class="k3">-</span><span class="n">1</span>,linebuf<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">59</td><td>    </td></tr><tr><td class="number">60</td><td>    lines<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>    pos1<span class="k3">=</span>pos<span class="k3">+</span><span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">62</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">63</td><td>  <span class="k1">while</span> <span class="k2">(</span>pos<span class="k3">&lt;</span>posmax <span class="k3">&amp;</span><span class="k3">&amp;</span> lines<span class="k3">&lt;</span><span class="n">8</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>&#160;</td></tr><tr><td class="number">65</td><td>  <span class="k1">return</span> lines<span class="k2">;</span></td></tr><tr><td class="number">66</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gerwin Broers)</author>
		<pubDate>Wed, 17 Jan 2007 01:21:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>A bit of advice: if you want to use the Allegro unicode routines properly, you cannot assume that a character is always one byte wide.  If you want to assume that, there&#39;s no point using the Allegro unicode routines: all effort for no gain.</p><p>As for your problem, I suggest making use of the debugger to inspect the values of any data structures modified by the function and work your way backwards.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Wang)</author>
		<pubDate>Wed, 17 Jan 2007 02:22:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Off-topic: Isn&#39;t your Avatar from one of the Goblin games Gerwin? <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Wed, 17 Jan 2007 03:01:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>thanks Peter,</p><p>more then one byte wide.. that complicates matters. but then again, the output of the  <br />text is always fine. The suspected memory leaks are never visible in the text as wrong characters. <br />I hoped the USETAT routine would check any writing out of bounds, and then prevent the writing. etc.</p><p>The purpose of the stated procedure is quite common: cut up a long sentence <br />to fit a limited width window. And it does that fine. <br />Maybe someone can point out another such procedure so I can learn from it. <br />I tried to learn from the allegro Gui text-window, but that procedure is more complex since it is aimed at a scrollable text. </p><p>I am not experienced in using the debugger in any way actually, but I will try. </p><p>richard; Indeed it is one of those goblins!</p><p>EDIT: I wrote set_uformat(U_ASCII); after allegro_init(); and the crash in debugmode is now gone. <br />I also set a breakpoint at the end of the draw_textblok procedure, and I could peek the values of the strings, which look fine to me. <br />But to my knowledge the coding was fine all along, but I still wonder why it crashed in the first place and if memory leaking is now gone or just unnoticable?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gerwin Broers)</author>
		<pubDate>Wed, 17 Jan 2007 03:11:50 +0000</pubDate>
	</item>
</rss>
