On 03/27/2012 02:57 PM, akaz wrote:

> B) In my function:
> private int msf_open(MSFilter* f, void* arg){ //a setter
> printf("msf_binfile_open-start\n============================\n");
> MSF_State* s=cast(MSF_State*)f.data;
> ms_mutex_lock(&(f.lock));
> s.filedesc = new File(*(cast(string*)arg),"w+b");

Judging from your free(f.data) proposal below, I think the problem is on the previous line: the object is allocated in GC's memory but s.filedesc is in a memory that GC is not scanning. You must call GC.addRange() when you allocate the memory that s.filedesc is living on.

> can you tell me if the line s.filedesc=new
> File(*(cast(string*)arg),"w+b"); PROPAGATES the change into f.data?

Yes. It is the same as in C.

> (recall that MSF_State* s=cast(MSF_State*)f.data;). I should also force,
> at the end of the function (just before return), something like:
> free(f.data); f.data=s; to propagate this?

Not to propagate, but you may have to call free() to avoid a leak.

> As dumb as it may seem: is my "s" variable in MSF_State*
> s=cast(MSF_State*)f.data; a POINTER or a VALUE?

A pointer just like in C.

>I should write
> s->filedesc? Or, maybe, (*s).filedesc?

That syntax has been useless even in C. (Although it communicates something to the reader.) The compiler could use the dot operator and do the right thing depending on whether the left-hand side was a pointer or an object.

D does not have the -> operator.

> I am a bit lost between pointers
> (s->x or (*s).x) and values (s.x). For structures there are pointers,
> for classes there are no pointers?

Yes.

Ali

Reply via email to