views:

110

answers:

2

I'm really confused.

// initial class
type
    TTestClass = 
        class( TInterfacedObject)
        end;

{...}

// test procedure
procedure testMF();
var c1, c2 : TTestClass;
begin
    c1 := TTestClass.Create(); // create, addref
    c2 := c1; // addref

    c1 := nil; // refcount - 1

    MessageBox( 0, pchar( inttostr( c2.refcount)), '', 0); // just to see the value
end;

It should show 1, but it shows 0. No matter how many assignments we'll perform, the value would not change! Why not?

+1  A: 

The compiler doesn't add in any ref-counting code if you assign it to a class type variable. The refcount was never even set to 1, much less 2.

You'll see the expected behavior if you declare c1 and c2 as IInterface instead of TTestClass.

Mason Wheeler
You'll see the expected behavior if you declare c1 and c2 as IInterface instead of TTestClass - this is what I'm really seeking for, HUGE THX!
Focker
+10  A: 

Refcount is only modified when you assign to an interface variable, not to an object variable.

procedure testMF(); 
var c1, c2 : TTestClass; 
    Intf1, Intf2 : IUnknown;
begin 
    c1 := TTestClass.Create(); // create, does NOT addref
    c2 := c1; // does NOT addref 

    Intf1 := C2;  //Here it does addref
    Intf2 := C1;  //Here, it does AddRef again

    c1 := nil; // Does NOT refcount - 1 
    Intf2 := nil; //Does refcount -1

    MessageBox( 0, pchar( inttostr( c2.refcount)), '', 0); // just to see the value 
    //Now it DOES show Refcount = 1
end; 
Ken Bourassa
thx Ken, it really does... I've missed smth with interfaces, it's my Epic Fail :( However I've learned this for all the rest of my life...
Focker