On 08 Oct 2009, at 16:18, Graeme Geldenhuys wrote:

2009/10/8 Jonas Maebe <jonas.ma...@elis.ugent.be>:
 SetLength(tocarray, _Header.ntoc);
 p := _Data + _Header.tocoffsetsstart;
 Move(p, tocarray, SizeOf(tocarray));

This has to be

move(p^, tocarray^, length(tocarray)*sizeof(tocarray[0]));
                                ^
This gives a compiler error. Illegal qualifier and points to the
second ^ in that statement.

It should have read move(p^, tocarray[0], length(tocarray)*sizeof(tocarray[0]));

   move(p^, tocarray, _Header.ntoc*sizeof(tocarray[0]));
Causes a segmentation fault at runtime.

That's is because you are blasting "_Header.ntoc*sizeof(tocarray[0])" bytes of data onto the stack starting at the address of tocarray. sizeof(tocarray) = sizeof(pointer). You are therefore overwriting everything on the stack coming after that variable (= higher on the stack).

     Move(p, tocarray[0], SizeOf(tocarray));
This causes an Access Violation at runtime.

That's because you are only initialising the first element (with the *value* of p no less, which is not a valid index in your file, but a pointer to some memory location), and later on reading every other element and using it as index in your loop.

My problem is not reading in the data. It reads in perfectly,

I explained in my original mail what that is the case (which you apparently saw in the mean time).

it's
just the cleanup of the local array that I am battling with.

Also with understanding how dynamic arrays and/or move work. Dynamic arrays are reference counted pointers to data blobs. sizeof(dynamic_array_var) = sizeof(pointer), always, and regardless of the length of the array. It's like sizeof(class) = sizeof(ansistring) = sizeof(pointer). Move() takes "var" parameters as first and second parameters, which means that it will read data from the memory *occupied by* the first argument (rather than memory it may point at) and store data into the memory *occupied by* the second argument (idem).

Heaptrc
keeps telling me there is a memory leak.

It is correct.


Jonas
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to