Struct delegate access corruption

tsbockman thomas.bockman at gmail.com
Wed Feb 17 20:44:46 UTC 2021


On Wednesday, 17 February 2021 at 20:18:53 UTC, Paul Backus wrote:
> On Wednesday, 17 February 2021 at 19:42:00 UTC, tsbockman wrote:
>> A copy constructor and opAssign can be used to update pointers 
>> that are relative to &this:
>>     https://dlang.org/spec/struct.html#struct-copy-constructor
>
> Unfortunately this is not enough, because the compiler is free 
> to implicitly move struct instances in memory any time it wants 
> to. See the bug report below for more details:
>
> https://issues.dlang.org/show_bug.cgi?id=17448
>
> Until D gets move constructors, structs with interior pointers 
> should be avoided.

That bug is about postblits, this(this), not copy constructors: 
this(ref typeof(this)). Copy constructors were added to the 
language specifically to fix those sort of problems. From the 
spec:

https://dlang.org/spec/struct.html#struct-postblit
> WARNING: The postblit is considered legacy and is not 
> recommended for new code. Code should use copy constructors 
> defined in the previous section. For backward compatibility 
> reasons, a struct that explicitly defines both a copy 
> constructor and a postblit will only use the postblit for 
> implicit copying. However, if the postblit is disabled, the 
> copy constructor will be used. If a struct defines a copy 
> constructor (user-defined or generated) and has fields that 
> define postblits, a deprecation will be issued, informing that 
> the postblit will have priority over the copy constructor.

However, since issue #17448 is still open I have posted a 
question to the issue report asking for clarification:
     https://issues.dlang.org/show_bug.cgi?id=17448#c39


More information about the Digitalmars-d-learn mailing list