[fpc-pascal] dynamic array contents and system.move
David Emerson
dle3ab at angelbase.com
Sat Apr 24 23:40:34 CEST 2010
I *am* checking sizes before the move, which is why it surprised me that things
were going out of bounds -- the trouble is I forgot the array index [0]
On Sat 24 Apr 2010, Martin wrote:
> On 24/04/2010 22:01, Andrew Brunner wrote:
> > David,
> >
> > I don't see how you are not getting memory leaks by doing a move
> > before making sure that the destination buffer has the memory
> > allocated. You see, in Delphi and FPC, move d/n actually move the
> > memory... It just copies it.
> >
> > You were warned :-)
> >
> > On Sat, Apr 24, 2010 at 3:01 PM, David Emerson<dle3ab at angelbase.com> wrote:
> >
> >> cobines wrote:
> >>
> >>> David Emerson wrote:
> >>>
> >>>> move (src.f_data, self.f_data, length(self.f_data) * sizeof(byte));
> >>>>
> >>> I think it should be:
> >>>
> >>> SetLength(self.f_data, length(src.f_data));
> >>> move (src.f_data[0], self.f_data[0], length(self.f_data) * sizeof(byte));
> >>>
> >>
> No he doesn't get leaks. If at all he would get crashes, by overwriting
> random memory.
>
> But in this case, it's (almost !) save.
> He uses " length(self.f_data)* sizeof(byte)" => so he never copies, more
> bytes to the target than the target can hold.
>
> He may however copy bytes from behind the source, reading random memory
> behind the source. He does not modify this random memory, so far so good
> => as long as the random meory behind the source is accesible to his
> process. If it's not accessible, then access violation.
>
> Martin
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
More information about the fpc-pascal
mailing list