Thread overview
How check if destructor has been called?
Sep 13, 2022
Injeckt
Sep 13, 2022
Ben Jones
Sep 14, 2022
Christian Köstlin
September 13, 2022

Hi, I'm trying to check if destructor has been called, but when I'm deleting class object I didn't get any calls from destructor.

myclass.d

~this() {
    this.log("\nDestructor\n");
    this._free_trash();
}

main.d

try {
    server.server_init(server);
} catch (Exception e) {
    server.log(e.msg);
    server = null;
}
September 13, 2022

On Tuesday, 13 September 2022 at 14:06:42 UTC, Injeckt wrote:

>

Hi, I'm trying to check if destructor has been called, but when I'm deleting class object I didn't get any calls from destructor.

myclass.d

~this() {
    this.log("\nDestructor\n");
    this._free_trash();
}

main.d

try {
    server.server_init(server);
} catch (Exception e) {
    server.log(e.msg);
    server = null;
}

Classes are allocated on the GC heap, so even though you're setting the reference to null, it's not being collected at that point. You can use destroy to make sure the destructor is called (see here: https://dlang.org/spec/class.html#destructors)

Or you could make your instance scope and then it basically follows the same lifetime rules as structs.

September 14, 2022
On 13.09.22 19:13, Ben Jones wrote:
> On Tuesday, 13 September 2022 at 14:06:42 UTC, Injeckt wrote:
>> Hi, I'm trying to check if destructor has been called, but when I'm deleting class object I didn't get any calls from destructor.
>>
>> myclass.d
>>
>>     ~this() {
>>         this.log("\nDestructor\n");
>>         this._free_trash();
>>     }
>>
>>
>> main.d
>>
>>     try {
>>         server.server_init(server);
>>     } catch (Exception e) {
>>         server.log(e.msg);
>>         server = null;
>>     }
> 
> Classes are allocated on the GC heap, so even though you're setting the reference to null, it's not being collected at that point.  You can use `destroy` to make sure the destructor is called (see here: https://dlang.org/spec/class.html#destructors)
> 
> Or you could make your instance `scope` and then it basically follows the same lifetime rules as `struct`s.
Some more things to watch out are mentioned in https://p0nce.github.io/d-idioms/#The-trouble-with-class-destructors.

In one of my programs I had problems with allocating in GC called destructors (by doing "harmless" writeln debugging).

Kind regards,
Christian