I'm a C++ programmer thats considering using D for a personal project I want to play around with. I was wondering if there's a way to completely disable the garbage collector, and what the risks are of doing so.
I know I can manage my own memory by overriding new and delete to use malloc and free, but if I did that I'd rather the garbage collector not run at all.
If you want to use malloc and free use std.c.stdlib. GC will never touch these. std.gc has all the stuff you will need for memory management including disable().
GC isn't a bad thing though. Most if not nearly all libraries in D will have somewhere in the code where memory is not explicitly deleted so it won't make you a hero to have it allways off but ok if you have some critical performance requirement.
GC makes everything a lot more productive like array slicing and creating new objects in parameters without having the caller store a reference anywhere to them. Good code is a lot less of it and with GC code becomes a lot smaller.
The GC can be removed and replaced with a simple wrapper around malloc/free.
To turn off the GC in D2:
If using D1/Phobos:
In D1/Tango:
The GC can be reenabled similarly by calling GC.enable (D2 or D1/Tango) or std.gc.enable (D1/Phobos). These can be done at any point in a program. Internally, a counter is used, and to actually reenable GC, you must call enable() once for every time disable() was called.
Here are some things not to do with GC disabled, because they will cause memory leaks:
That said, while D is designed to be usable with the GC disabled in a few critical pieces of code (the kind of critical pieces where real time constraints exist and you probably shouldn't be using any form of malloc not explicitly designed for real time computing anyhow), it was largely designed with the assumption that GC would be present. In your case, you can still use GC for all of the initialization stuff, etc. and only disable it when you hit the part of your game that actually needs to be real time.
As a side note, GC and manual memory management can coexist in D, and in practice, when optimizing code, manually deleting some large objects with trivial lifetimes can result in significant speedups. This can be done similarly to C++, using a delete statement, and is safe to do even if the GC is enabled. When you don't have real time constraints, this gives you most of the benefits of GC with most of the performance of manual memory management.
I was reading about D language and I found this in the specs that seems new in D:
One of the consequence of using this command-line flag is to disable GC and language features relaying on it.
see also https://dlang.org/blog/2017/08/23/d-as-a-better-c/