Excellent explication !
Thank you Frits

Le Sat, 14 Feb 2009 17:58:35 +0100, Frits van Bommel <fvbom...@remwovexcapss.nl> a écrit:

TSalm wrote:
Hello,
In the code below, why the first Stdout throws a Exception when the second doesn't ?
 /*  -------- CODE --------   */
import tango.io.Stdout;
  struct VoidPtr(T)
{
  void* vPtr;
   void value(T val)
  {
    vPtr = &val;

Here you're storing a pointer to a non-ref parameter. This is the bug; the parameter itself is implicitly deallocated on returning from this function.
Change to 'ref T val' to fix it.

Essentially, an array is a struct { size_t length; T ptr; }. This means 'val' refers to a copy in the stack frame of this function, not to 'arr' in main().

  }
   T value()
  {
    return *(cast(T*)vPtr);
  }
}
  void main()
{
  VoidPtr!(char[][]) vPtr ;
   char[][]  arr = [ "hello" , "you" ];
   vPtr.value =  arr ;
Stdout( vPtr.value ).newline; // <-- [tango.core.Exception.OutOfMemoryException: Memory allocation failed

Here you're calling a new function, overwriting *vPtr with something else (probably vptr itself), resulting in a huge array when you try to read it later.

   Stdout( *(cast(char[][]*) vPtr.vPtr ) ); // <-- This works good

This reads the (implicitly deallocated) 'val' parameter before it gets overwritten, hiding the bug. It's still there: just because the code doesn't crash doesn't mean it's correct.

}
 /*  ------ END CODE ------  */
  Thanks in advance for your help,
TSalm

Reply via email to