[fpc-pascal] dynamic array contents and system.move

Martin fpc at mfriebe.de
Sat Apr 24 23:17:55 CEST 2010


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



More information about the fpc-pascal mailing list