Why dtor are not executed when removing a struct from associative arrays?
Ali Çehreli
acehreli at yahoo.com
Mon Sep 20 16:24:16 UTC 2021
On 9/20/21 5:23 AM, Learner wrote:
> I was expecting S instance dtor called
> S is being destructed
If you are sure the element can be destroyed, you can call destroy():
import std.stdio;
enum someSpecialInitValue = 777;
struct S
{
int i = someSpecialInitValue;
this(int i)
{
this.i = i;
}
~this()
{
writeln("S with ", i, " is being destructed");
}
}
void destroyAndRemove(AA, Key)(AA aa, Key key) {
auto found = key in aa;
if (found) {
destroy(*found);
aa.remove(key);
}
}
void main()
{
S[int] aa;
aa[1] = S(1);
aa.destroyAndRemove(1);
writeln("Actually, 2 dtor calls! :)");
}
destroy() puts the object to its initial state, which means, it gets
destroyed again. That's why there are two destructor calls below for the
same object. I used a special value to demonstrate the second destructor
is called on the init state:
S with 1 is being destructed
Actually, 2 dtor calls! :)
S with 777 is being destructed
Ali
More information about the Digitalmars-d-learn
mailing list