Can pointers to values inside associative arrays become invalid?

Idan Arye via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Jan 6 09:39:50 PST 2015


On Tuesday, 6 January 2015 at 16:30:14 UTC, H. S. Teoh via 
Digitalmars-d-learn wrote:
> On Tue, Jan 06, 2015 at 04:18:17PM +0000, Idan Arye via 
> Digitalmars-d-learn wrote:
>> I have an associative array, and I use the `in` operator to 
>> get a
>> reference to a value inside it and store it in a pointer:
>> 
>>     int[string] aa;
>>     aa["myKey"] = 42;
>>     int* myPointer = "myKey" in aa;
>> 
>> Is it possible that due to rehashing or something D will 
>> decide to
>> move the associative array's values around, resulting in 
>> `myPointer`
>> no longer pointing to `aa["myKey"]`?
>
> AFAIK, not in the current implementation. Each key/value pair 
> is kept in
> its own bucket, and rehashing doesn't move the bucket's 
> position in
> memory, only relinks it with the other hash structures.
>
> However, if you delete the key from the AA, you might have 
> problems, as
> the current implementation will forcefully call GC.free() on 
> the bucket,
> which makes any other pointers to it dangling.
>
> This is all implementation-dependent behaviour, though. If you 
> need to
> rely on retaining pointers to keys/values, probably the better 
> thing to
> do is to make your keys/values reference types, and keep the 
> references
> to them instead of holding on to the pointer returned by 'in'. 
> Relying
> on implementation-dependent behaviour is liable to come back to 
> haunt
> you later when the implementation changes.
>
>
> T

I see... quite a shame there are no built-in data structures that 
provide forever-valid references to their members. Arrays can be 
reallocated, associative arrays can be rehased, and the stuff in 
std.collection does not expose the internal references...


More information about the Digitalmars-d-learn mailing list