Thread overview
How to allocate/free memory under @nogc
May 21, 2020
data pulverizer
May 21, 2020
Paul Backus
May 21, 2020
Adam D. Ruppe
May 21, 2020
Konstantin
May 22, 2020
Kagamin
May 22, 2020
welkam
May 21, 2020
I'm a bit puzzled about the whole `@nogc` thing. At first I thought it just switched off the garbage collector and that you had to allocate and free memory manually using `import core.memory: GC;` I tried this and it failed because @nogc means that the function can not allocate/free memory (https://dlang.org/spec/function.html#nogc-functions). If this is the case, how do you allocate/free memory without using the garbage collector? Does allocating and freeing memory using `GC.malloc` and `GC.free` avoid D's garbage collector? Also what is the syntax for removing dangling pointers?

Can you also confirm that `@nogc` in a class do the same thing in that class as it does for a function? Also structs are not supposed to be tracked by the garbage collector but if I do something like this:

```
struct MyType(T)
{
  T[] data;
  this(size_t n)
  {
    data = new T[n];
  }
}
```

Is `data` in `MyType` tracked by the garbage collector? If it is how do I allocate it in such a way that it is not?

Thanks

May 21, 2020
On Thursday, 21 May 2020 at 02:50:22 UTC, data pulverizer wrote:
> I'm a bit puzzled about the whole `@nogc` thing. At first I thought it just switched off the garbage collector and that you had to allocate and free memory manually using `import core.memory: GC;` I tried this and it failed because @nogc means that the function can not allocate/free memory (https://dlang.org/spec/function.html#nogc-functions). If this is the case, how do you allocate/free memory without using the garbage collector? Does allocating and freeing memory using `GC.malloc` and `GC.free` avoid D's garbage collector? Also what is the syntax for removing dangling pointers?

Marking a function @nogc means you can't use the garbage collector in that function, or call other functions that use it. It's still there, and functions that are not marked @nogc can still use it.

To allocate memory without the GC, you have a couple of options. The simplest is to use C's malloc function, which can be found in the core.stdc.stdlib module. A more complicated but more powerful option is to use a non-GC-based memory allocator from the std.experimental.allocator package. Either way, you will have to take care of freeing the memory yourself, either manually or using a technique like RAII.
May 21, 2020
On Thursday, 21 May 2020 at 02:50:22 UTC, data pulverizer wrote:
> Can you also confirm that `@nogc` in a class do the same thing in that class as it does for a function?

I don't think it does anything in either case, but if it does anything it will just apply @nogc to each member function in them.

> Is `data` in `MyType` tracked by the garbage collector?

Yes, it is tracked. What @nogc does is prohibit calling that function from ever calling the GC's collect method. It doesn't affect what is and isn't collected when that is eventually called somewhere else.

> If it is how do I allocate it in such a way that it is not?

though you can malloc memory to hide it from the GC, you generally shouldn't.

Note that in your example if T is ubyte or some other trivial value type it isn't scanned anyway since the static type info tells it it will never contain pointers/references.
May 21, 2020
On 5/20/20 10:50 PM, data pulverizer wrote:
> how do you allocate/free memory without using the garbage collector? 

Use C malloc and free.

> Does allocating and freeing memory using `GC.malloc` and `GC.free` avoid D's garbage collector?

No, an allocation can trigger a collection. D does not have a scheduled GC, it basically runs the GC when it can't allocate any more memory from it's pools before it tries to get more from the OS.

I *think* that @nogc is supposed to mean "Be able to run this without a GC implemented", not that no collections will run.

-Steve
May 21, 2020
On Thursday, 21 May 2020 at 15:09:57 UTC, Steven Schveighoffer wrote:
> On 5/20/20 10:50 PM, data pulverizer wrote:
>> how do you allocate/free memory without using the garbage collector?
>
> Use C malloc and free.
>
>> Does allocating and freeing memory using `GC.malloc` and `GC.free` avoid D's garbage collector?
>
> No, an allocation can trigger a collection. D does not have a scheduled GC, it basically runs the GC when it can't allocate any more memory from it's pools before it tries to get more from the OS.
>
> I *think* that @nogc is supposed to mean "Be able to run this without a GC implemented", not that no collections will run.
>
> -Steve

Hi all! I will try to ask again(previous two posts still have no answers) : are there any site/page/docs somewhere to track actual info about @nogc support in language itself and in phobos library? Or, at least plans to extend such support?

May 22, 2020
On Thursday, 21 May 2020 at 17:19:10 UTC, Konstantin wrote:
> Hi all! I will try to ask again(previous two posts still have no answers) : are there any site/page/docs somewhere to track actual info about @nogc support in language itself and in phobos library? Or, at least plans to extend such support?

https://dlang.org/spec/function.html#nogc-functions - here's language support. Phobos tends to infer attributes like @nogc, so it's context dependent, the actual info is provided by the compiler.
May 22, 2020
There is automem to help with manual memory management
https://code.dlang.org/packages/automem