<div dir="ltr">Dear Miguel,<br><br>Another rigorous solution could be to use standard C++ exception checking:<br><br><pre><code><var>try</var>
  {
    <var>int</var>* myarray= <var>new</var> <var>int</var>[10000];
  }
  <var>catch</var> (std::bad_alloc& ba)
  {
    std::cerr << <kbd>"bad_alloc caught: "</kbd> << ba.what() << <kbd>'\n'</kbd>;
  }</code></pre>The [1] reference you give us, is the standard procedure that arise by using .push_back(...) on a std::vector<X> array.<br><br><br></div><div class="gmail_extra"><br><br><div class="gmail_quote">2013/5/31 Miguel Colom <span dir="ltr"><<a href="mailto:colom@cmla.ens-cachan.fr" target="_blank">colom@cmla.ens-cachan.fr</a>></span><br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Dear all,<br>
now we're receiving corrected versions of the programs that didn't work properly.<br>
<br>
Some of these problems seem to be similar, so I think it's worth making a short comment about them.<br>
<br>
Basically, they're related to memory management and allocation.<br>
<br>
If you known the exact amount of memory you need, allocate it exactly. Do not allocate more memory than you need, because it might mask a buffer overrun problem.<br>
<br>
Then, once the mount of memory is known, always use the "new" operator in C++ or the "malloc" function in C to allocate memory.<br>
Declaring a long array like array[9876543] will compile but it's not ensured that the operating system has set enough room at the stack for so much memory. In this case, the program will fail with a segmentation fault because of a (prevented) stack overflow.<br>


<br>
If you don't know a priori the exact amount of memory, you shouldn't try to allocate a very long array of an arbitrary size. This is a waste of memory and it doesn't even ensure that the program won't fail because of a buffer overrun problem. Again, this only masks the problem.<br>


<br>
The solution in this case is to allocate an initial estimation of memory and during the execution control if it's enough or not. If it's not, then<br>
1) Create a new array whose size is double.<br>
2) Copy the contents of the array to the new one.<br>
<br>
You can write a function that does this and changes the pointer to the allocated memory, all transparently.<br>
<br>
This strategy, called geometric expansion, gives an amortized cost between memory waste/cost of copying [1].<br>
<br>
Best,<br>
Miguel<br>
<br>
[1] <a href="http://en.wikipedia.org/wiki/Dynamic_array#Geometric_expansion_and_amortized_cost" target="_blank">http://en.wikipedia.org/wiki/<u></u>Dynamic_array#Geometric_<u></u>expansion_and_amortized_cost</a><div class="im HOEnZb">

<br>
<br>
Quoting Miguel Colom <<a href="mailto:Miguel.Colom@cmla.ens-cachan.fr" target="_blank">Miguel.Colom@cmla.ens-cachan.<u></u>fr</a>>:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Dear all,<br>
we've observed some programs crashing at the production server.<br>
</blockquote>
<br></div><div class="HOEnZb"><div class="h5">
--<br>
IPOL - Image Processing On Line   - <a href="http://ipol.im/" target="_blank">http://ipol.im/</a><br>
<br>
contact     <a href="mailto:edit@ipol.im" target="_blank">edit@ipol.im</a>          - <a href="http://www.ipol.im/meta/contact/" target="_blank">http://www.ipol.im/meta/<u></u>contact/</a><br>
news+feeds  twitter @IPOL_journal - <a href="http://www.ipol.im/meta/feeds/" target="_blank">http://www.ipol.im/meta/feeds/</a><br>
announces   <a href="mailto:announce@list.ipol.im" target="_blank">announce@list.ipol.im</a> - <a href="http://tools.ipol.im/mm/announce/" target="_blank">http://tools.ipol.im/mm/<u></u>announce/</a><br>
discussions <a href="mailto:discuss@list.ipol.im" target="_blank">discuss@list.ipol.im</a>  - <a href="http://tools.ipol.im/mm/discuss/" target="_blank">http://tools.ipol.im/mm/<u></u>discuss/</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br><div><font>Regards/Cordialement,</font></div><div><font>Pierre M</font></div>
</div>