July 17, 2023
This works also:

```

import std.stdio:writefln;
import object: destroy;
import core.memory: GC;
import core.stdc.stdlib: malloc,free;
import std.typecons;

class C {
     int * pa;
     int [] a;
 // Constructor
 this() {writefln("Called constructor");
           pa=cast(int *)malloc(1000*int.sizeof);
           a=pa[0..1000];
          }

}

void dofun()
{
   scope x=new C;
   x.a[3]=5;
   writefln("%12x",&x);

}
int main(){
   dofun();
   dofun();
   return 0;

}

```



July 17, 2023
17.07.2023 15:45, Alain De Vos пишет:
> This works also:
> 
> [snipped]
> 
> 

Despite this time you use new you still allocate your class on stack using scope and its scope still is `dofun`. But I just want to inform you. Your solutions work. Don't get me wrong.

N.B. I would say if you do not have THE reason to manually free memory - do not do this. At all. Just let GC does its work.

July 17, 2023
Here is i use new,

```

import std.stdio:writefln;
import object: destroy;
import core.memory: GC;
import core.stdc.stdlib: malloc,free;
import std.typecons;

class C {
     int * pa;
     int [] a;
        // Constructor
        this() {writefln("Called constructor");
           pa=cast(int *)malloc(1000*int.sizeof);
           a=pa[0..1000];
          }

}

void dofun()
{
   scope x=new C;
   x.a[3]=5;
   writefln("%12x",&x);

}
int main(){
   dofun();
   dofun();
   return 0;

}

```

July 17, 2023

On 7/16/23 11:41 PM, Alain De Vos wrote:

>

The following program prints two different addresses.
Meaning the new allocates memory until the program dies.
So the means memory leak by default ?


import std.stdio:writefln;
import object: destroy;
import core.memory: GC;

void dofun(){
     auto a=new int[1000];
     writefln("%12x",&a);
     destroy(a);
     GC.free(a.ptr);
}

int main(){
     dofun();
     auto b=new int[1000];
     writefln("%12x",&b);
     return 0;
}

No, what I am trying to explain is that destroy(a) is literally equivalent to a = null.

If you then free(a) do you think it does anything?

-Steve

July 17, 2023

On 7/16/23 11:58 PM, Alain De Vos wrote:

>

Maybe code above works when you enforce an Garbage-collection-run ?

Code below works fine. So you cannot use "new" but must use malloc?


import std.stdio:writefln;
import object: destroy;
import core.memory: GC;
import core.stdc.stdlib: malloc,free;


void dofun(){
    auto pa=cast(int *)malloc(1000*int.sizeof);
    writefln("%12x",pa);
    auto a=pa[0..1000];
    free(a.ptr);
}

int main(){
     dofun();
    auto pb=cast(int *)malloc(1000*int.sizeof);
    writefln("%12x",pb);
    auto b=pb[0..1000];
    free(b.ptr);
    return 0;

}

Notice how you didn't call destroy(a) there. If you did, then free(a) would be equivalent to free(null), which would do nothing.

-Steve

July 17, 2023

On Sunday, 16 July 2023 at 18:18:08 UTC, Alain De Vos wrote:

>

12 │ ~this(){
13 │ writeln("Free heap");
14 │ import object: destroy;
15 │ import core.memory: GC;
16 │ i=null; // But How to force GC free ?

Firstly, be careful with class destructors and GC managed objects. The memory referenced by i may already have been freed by the GC when the class destructor is called - see:
https://dlang.org/spec/class.html#destructors

If you want to free GC memory when you know the allocation is still live, you can call __delete:
https://dlang.org/phobos/core_memory.html#.__delete

import std.stdio: writeln;

void main()
{
    int[] i=null;
    writeln("Allocate heap");
    i=new int[10000];
    i[9000]=5;

    import core.memory;
    const p = i.ptr;
    assert(GC.addrOf(p) !is null);
    writeln("Free heap");
    __delete(i);
    assert(GC.addrOf(p) is null);
}
July 17, 2023

This works also,


class C {
     int * pa;
     int [] a;
        // Constructor
        this() {writefln("Called constructor");
           pa=cast(int *)malloc(1000*int.sizeof);
           a=pa[0..1000];
          }

}

void dofun()
{
   scope x=new C;
   x.a[3]=5;
   writefln("%12x",&x);

}
int main(){
   dofun();
   dofun();
   return 0;

}

July 17, 2023

On Monday, 17 July 2023 at 16:52:00 UTC, Alain De Vos wrote:

>

This works also,


class C {
     int * pa;
     int [] a;
        // Constructor
        this() {writefln("Called constructor");
           pa=cast(int *)malloc(1000*int.sizeof);
           a=pa[0..1000];
          }

}

void dofun()
{
   scope x=new C;
   x.a[3]=5;
   writefln("%12x",&x);

}
int main(){
   dofun();
   dofun();
   return 0;

}

Remember to use free, this is not managed by the GC

1 2
Next ›   Last »