Hello,

I'm very new to D. I started playing around trying to understand language behavior. How to use RAII in D, etc.

I'm having trouble understanding what is happening here, and maybe this is a bug.

Here is the code showing the weird behavior. I'm using dmd 2.066 (on linux)

import std.stdio;
import std.typecons;
import std.traits;

struct Frame
{
  ~this(){
    printf("DTOR FRAME\n");
  }

  this(int v)  {
    writeln("CTOR FRAME");
    this.i = v;
  }
  int i;
}

class Container
{
  void add(int i){
    f ~= RefCounted!(Frame)(i);
  }

  ~this()  {
    printf("DTOR CONT\n");
foreach (ref mbr; f) writeln("Count: ", mbr.refCountedStore.refCount);
    f = [];
  }

  this() {
    writeln("CTOR CONT");
  }

  RefCounted!(Frame)[] f;
}

void main()
{
  auto l = scoped!Container();
  foreach (i ; 1..10)
      l.add(i);
}

While the destructor of Container is called, the frame's destructor are not called. Printing the current reference count for each frame gives unexpected results.

Below is the program output:

CTOR CONT
CTOR FRAME
CTOR FRAME
CTOR FRAME
CTOR FRAME
CTOR FRAME
CTOR FRAME
CTOR FRAME
CTOR FRAME
CTOR FRAME
DTOR CONT
Count: 4
Count: 3
Count: 3
Count: 2
Count: 2
Count: 2
Count: 2
Count: 1
Count: 1

Am I doing something wrong or is this a bug? Could someone please try to explain?

Thanks !

Reply via email to