Weird behavior: array of RefCounted struct

Xaqq via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Tue Sep 9 09:13:24 PDT 2014


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 !


More information about the Digitalmars-d-learn mailing list