www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 21693] New: extern(C++) class instance dtors are never

https://issues.dlang.org/show_bug.cgi?id=21693

          Issue ID: 21693
           Summary: extern(C++) class instance dtors are never called,
                    breaking RAII
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: critical
          Priority: P1
         Component: dmd
          Assignee: nobody puremagic.com
          Reporter: thomas.bockman gmail.com

The program below never destroys its extern(C++) class instances, breaking
RAII. Output since 2.066:

    Destroying stack D instance.
    Destroying heap D instance.

The destructor should definitely be called for the `scope` instance, as it
would be for a struct on the stack. The heap instance's destructor should also
be called, OR trying to allocate an instance of an extern(C++) class that has a
destructor on the GC heap using `new` should be a compile-time error.

/////////////////////////////////////
extern(C++) class C {
    bool onStack;
    this(bool onStack) {
        this.onStack = onStack; }
    ~this() {
        writeln("Destroying ", onStack? "stack" : "heap", " C instance."); }
}
extern(D) class D {
    bool onStack;
    this(bool onStack) {
        this.onStack = onStack; }
    ~this() {
        writeln("Destroying ", onStack? "stack" : "heap", " D instance."); }
}

void main() {
    scope stackC = new C(true);
    auto heapC = new C(false);
    scope stackD = new D(true);
    auto heapD = new D(false);
}
/////////////////////////////////////

Related: https://issues.dlang.org/show_bug.cgi?id=21692

--
Mar 08