Jump to page: 1 2
Thread overview
How to free memory ater use of "new" to allocate it.
Jul 16, 2023
Alain De Vos
Jul 16, 2023
Alain De Vos
Jul 17, 2023
Alain De Vos
Jul 17, 2023
Alain De Vos
Jul 17, 2023
Alain De Vos
Jul 17, 2023
drug007
Jul 17, 2023
Alain De Vos
Jul 17, 2023
drug007
Jul 17, 2023
Alain De Vos
Jul 17, 2023
Nick Treleaven
Jul 17, 2023
Alain De Vos
July 16, 2023

I don't use malloc

import std.stdio: writeln;
   2   │
   3   │ class C{
   4   │     int[] i=null;
   5   │     this(){
   6   │         writeln("Allocate heap");
   7   │         i=new int[10000];
   8   │         writeln(typeid(typeof(i)));
   9   │         writeln(typeid(typeof(i.ptr)));
  10   │         i[9000]=5;
  11   │     }
  12   │     ~this(){
  13   │         writeln("Free heap");
  14   │         import object: destroy;
  15   │         import core.memory: GC;
  16   │         i=null; // But How to force GC free ? -------------?
  17   │     };
  18   │ }
July 17, 2023
You can do it with ``GC.free``.

But you really shouldn't need to (it won't automatically release it back to OS).

https://dlang.org/phobos/core_memory.html#.GC.free
July 16, 2023
Is this ok ?
```
void main(){
	int[] i=new int[10000];
    import object: destroy;
	destroy(i);
    import core.memory: GC;
	GC.free(GC.addrOf(cast(void *)(i.ptr)));
}
```
July 17, 2023
Yes.

For basic types like int's, you don't need to destroy the array.

As long as you don't slice the array and store that in i, you don't need to call addrOf too.
July 16, 2023

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

>

Is this ok ?

void main(){
     int[] i=new int[10000];
     import object: destroy;
     destroy(i);
     import core.memory: GC;
     GC.free(GC.addrOf(cast(void *)(i.ptr)));
}

No, that won't work. Check out i value after you call destroy on it:

destroy(i); // basically sets i = null
assert(i.ptr is null); // yep
GC.free(i.ptr); // basically free(null) which is a no-op

Also note that destroy is shallow. It does not dig into pointers or arrays. So even if your array was of elements with a destructor, destroying the array doesn't destroy the elements.

In this case, all you need to do is:

GC.free(GC.addrOf(i.ptr));

You don't need the cast here. You shouldn't need the addrOf, but this is still open: https://issues.dlang.org/show_bug.cgi?id=13558

-Steve

July 17, 2023

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

July 17, 2023

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;

}

July 17, 2023
Steven is right, was quite late when I said that so it'll work but not for the reasons I thought it would.
July 17, 2023
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",&x);

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

}


```

July 17, 2023
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",&x);
> 
> }
> 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
« First   ‹ Prev
1 2