ubyte array changing values between calls? Possible bug?
Gary Willoughby
dev at nomad.so
Sun Dec 15 04:52:32 PST 2013
On Sunday, 15 December 2013 at 00:21:37 UTC, Ali Çehreli wrote:
> On 12/14/2013 10:48 AM, Gary Willoughby wrote:
>
> > On Friday, 13 December 2013 at 17:35:27 UTC, John Colvin
> wrote:
>
> >>> public void opAssign(uint value)
> >>> {
> >>> this._octets = value.nativeToBigEndian();
> >>> assert(this._octets == [1, 2, 3, 4]);
> >>> }
> >>> }
>
> >> opAssign is escaping a reference to its stack by assigning
> the static
> >> array to the slice _octets. Therefore, garbage.
> >
> > I'm not going to lie that has gone over my head a little.
> Could you
> > explain it more simply please? I just want to totally
> understand the
> > issue here. Thanks.
>
> According to documentation, nativeToBigEndian returns a static
> array (fixed-length array):
>
> http://dlang.org/phobos/std_bitmanip.html#.nativeToBigEndian
>
> It says "returns it as a ubyte[n] where n is the size of the
> given type."
>
> Since static arrays normally live on the stack, the returned
> array is a local array.
>
> As with any slice assignment, the assignment to this._octets in
> opAssign makes _octets a slice to the elements of that local
> array. Upon leaving opAssign that array is no more. So, _octets
> is left referring to elements that are long gone. :(
>
> Ali
Ah right, that now makes perfect sense. Thanks all! :)
More information about the Digitalmars-d-learn
mailing list