Thread overview
Extremely funny behavior .. could be a bug?
Sep 12, 2014
seany
Sep 12, 2014
Ali Çehreli
Sep 12, 2014
seany
Sep 12, 2014
Ali Çehreli
September 12, 2014
consider the following :

in file a.d

module a;

class class_a
{

   struct RESULT{
   string[] raw;
   void* res;
  }


RESULT r;

void dothing()
{
   r = new RESULT;

   string aa = "string";

   r.raw ~= aa;
   r.res = cast(void*) aa;
}

}


in file b.d

import a;    // import path is okey

class class_b;
{

   void doThings(class_a * ptr_a)
  {
     class_a A = &ptr_a;
     writeln(A.r.raw[0]); // prints aa;
     writeln(A.r.res);    // fails : core.exception.OutOfMemoryError@(0)
                              // but if i do comment the line :
                              // writeln(A.r.raw[0]); out, then works
  }
}


in file c.d

import a;
import b;

void main() {

clsa = new class_a;
clsb = new class_b;

clsa.dothing();
clsa.doThings( & clsa);


}


I can not find a reason why accessing A.r.raw will erase (invoke the garbage collector) to remove A.r.res. Please help.
September 12, 2014
There are multiple problems with the code. Is that really what you are using?

On 09/12/2014 06:35 AM, seany wrote:
> consider the following :
>
> in file a.d
>
> module a;
>
> class class_a
> {
>
>     struct RESULT{
>     string[] raw;
>     void* res;
>    }
>
>
> RESULT r;
>
> void dothing()
> {
>     r = new RESULT;

Error: cannot implicitly convert expression (new RESULT) of type RESULT* to RESULT

>
>     string aa = "string";
>
>     r.raw ~= aa;
>     r.res = cast(void*) aa;
> }
>
> }
>
>
> in file b.d
>
> import a;    // import path is okey
>
> class class_b;

That semicolon should not be there?

> {
>
>     void doThings(class_a * ptr_a)
>    {
>       class_a A = &ptr_a;

Error: cannot implicitly convert expression (& ptr_a) of type class_a** to a.class_a

[...]

Ali

September 12, 2014
On Friday, 12 September 2014 at 15:26:34 UTC, Ali Çehreli wrote:


you are right, it was a reduced form, of a very complex software.

in file a.d

module a;

class class_a
{

   struct RESULT{
   string[] raw;
   void* res;
  }


RESULT * r;

void dothing()
{
   r = new RESULT;

   string aa = "string";

   r.raw ~= aa;
   r.res = cast(void*) aa;
}

}


in file b.d

import a;    // import path is okey

class class_b
{

   void doThings(class_a * ptr_a)
  {
     class_a A = *ptr_a;
     writeln(A.r.raw[0]); // prints aa;
     writeln(A.r.res);    // fails : core.exception.OutOfMemoryError@(0)
                              // but if i do comment the line :
                              // writeln(A.r.raw[0]); out, then works
  }
}


in file c.d

import a;
import b;

void main() {

clsa = new class_a;
clsb = new class_b;

clsa.dothing();
clsa.doThings( & clsa);


}
September 12, 2014
On 09/12/2014 12:16 PM, seany wrote:

> On Friday, 12 September 2014 at 15:26:34 UTC, Ali Çehreli wrote:
>
>
> you are right, it was a reduced form, of a very complex software.

Maybe others can figure it out by reading the code but a working code that reproduces the problem is very important for me. :)

I still had to do three modifications:

1) In b.d, add 'import std.stdio;'

2) In c.d, use 'auto' when constructing clsa and clsb

3) In c.d, call doThings() on clsb, not clsa

Unfortunately, there were no errors for me with a very recent dmd git head and I got the following output:

string
4293D0

Ali