Why dtor are not executed when removing a struct from associative arrays?

Steven Schveighoffer schveiguy at gmail.com
Tue Sep 21 10:51:43 UTC 2021


On 9/21/21 2:06 AM, Tejas wrote:
> On Monday, 20 September 2021 at 18:13:53 UTC, Steven Schveighoffer wrote:
>> On 9/20/21 10:22 AM, Tejas wrote:
>>> In case you still want to delete stuff deterministically despite what 
>>> Steve said, I suggest you make your `struct` a reference and use 
>>> `core.memory.__delete`(not recommended to use this carelessly, btw)
>>
>> Do not call `__delete` here, use `destroy`. `__delete` will attempt to 
>> deallocate the block, which likely will fail since the key comes 
>> before the value, and GC.free on an interior pointer (I think) fails.
>>
>> But if it succeeded, it would not be good. This leaves a dangling 
>> pointer inside the AA. Rehashing the AA likely would result in a 
>> memory corruption.
>>
>> If you use destroy, the destructor will be called by the GC as well, 
>> but a struct should properly handle destroying the .init value.
>>
> 
> It doesn't succeed when object is stack allocated, otherwise it works; 
> that's why I suggested changing `S` to `S*`.

Oh! I missed that subtle change. I thought you were deleting a pointer 
to S that lives in a `S[int]`.

I still recommend against this because you can easily get a dangling 
pointer that way. Aside from that, if you are careful enough not to 
store a retrieved S* from the aa, you could do that. It will incur one 
extra allocation per element, which is not ideal.

Using destroy should be the most effective and safest mechanism.

-Steve


More information about the Digitalmars-d-learn mailing list