Crash writing and reading back class instance address to void*

FreeSlave via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Mon Aug 18 03:36:59 PDT 2014


On Monday, 18 August 2014 at 10:07:30 UTC, Remi Thebault wrote:
> Hi
>
> Starting to use GtkD TreeModel, I write an instance of an 
> abstract class to TreeIter.userData.
>
> When reading back the void pointer and casting to my abstract 
> class leads to crash when instance is used (Task is the 
> abstract class):
>
>
>         int fillIter(TreeIter iter, Task t)
>         {
>             if (!t || !iter) return 0;
>
>             iter.stamp = stamp_;
>
>             writeln("writing ", cast(void*)&t);
>             iter.userData = cast(void*)&t;
>
>             return 1;
>         }
>
>
>         Task taskFromIter(TreeIter iter)
>         {
>             if (!iter || iter.stamp != stamp_) return null;
>
>             writeln("reading ", iter.userData);
>             writeln(cast(Task)iter.userData);
>             return cast(Task)iter.userData;
>         }
>
> the code prints
> writing 18FC98
> reading 18FC98
>
> and crashes at the 2nd writeln call in taskFromIter function 
> with message object.Error@(0): Access violation
>
> The instance is referenced somewhere else in the model, so it 
> should not get garbage collected. should I check this anyway?
>
> Any idea?
>
> thanks
> RĂ©mi

Classes are reference types. You take reference of local 
reference (it's address on stack). Use just cast(void*)t


More information about the Digitalmars-d-learn mailing list