Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Ernesto Castellotti via Digitalmars-d-learn

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",);

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

}

```


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



Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Alain De Vos via Digitalmars-d-learn

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",);

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

}

```


Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Nick Treleaven via Digitalmars-d-learn

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;

```d
void main()
{
int[] i=null;
writeln("Allocate heap");
i=new int[1];
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);
}
```


Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Steven Schveighoffer via Digitalmars-d-learn

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


Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Steven Schveighoffer via Digitalmars-d-learn

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",);
     destroy(a);
     GC.free(a.ptr);
}

int main(){
     dofun();
     auto b=new int[1000];
     writefln("%12x",);
     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


Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Alain De Vos via Digitalmars-d-learn

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",);

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

}

```



Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread drug007 via Digitalmars-d-learn

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.




Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Alain De Vos via Digitalmars-d-learn

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",);

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

}

```





Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread drug007 via Digitalmars-d-learn

17.07.2023 13:17, Alain De Vos пишет:

The following code works:

```
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];
   }

    ~this(){
   writefln("Called Destructor");
   free(a.ptr);}

}

void dofun()
{
    auto x=scoped!(C);
    x.a[3]=5;
    writefln("%12x",);

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

}


```



Note that you do not use new anymore. You allocate your class instances 
on stack and their scope is `dofun()` only


Re: How to free memory ater use of "new" to allocate it.

2023-07-17 Thread Alain De Vos via Digitalmars-d-learn

The following code works:

```
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];
  }

   ~this(){
  writefln("Called Destructor");
  free(a.ptr);}

}

void dofun()
{
   auto x=scoped!(C);
   x.a[3]=5;
   writefln("%12x",);

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

}


```