Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

D Dynamic Arrays - RAII

I admit I have no deep understanding of D at this point, my knowledge relies purely on what documentation I have read and the few examples I have tried.

In C++ you could rely on the RAII idiom to call the destructor of objects on exiting their local scope.

Can you in D?

I understand D is a garbage collected language, and that it also supports RAII. Why does the following code not cleanup the memory as it leaves a scope then?

import std.stdio;

void main() {
      {
            const int len = 1000 * 1000 * 256; // ~1GiB

            int[] arr;
            arr.length = len;
            arr[] = 99;
      }

      while (true) {}
}

The infinite loop is there so as to keep the program open to make residual memory allocations easy visible.

A comparison of a equivalent same program in C++ is shown below. C++ v D

It can be seen that C++ immediately cleaned up the memory after allocation (the refresh rate makes it appear as if less memory was allocated), whereas D kept it even though it had left scope.

Therefore, when does the GC cleanup?

like image 349
deceleratedcaviar Avatar asked May 24 '11 04:05

deceleratedcaviar


1 Answers

scope declarations are going in D2, so I'm not terribly certain on the semantics, but what I'd imagine is happening is that scope T[] a; only allocates the array struct on the stack (which needless to say, already happens, regardless of scope). As they are going, don't use scope (using scope(exit) and friends is different -- keep using them).

Dynamic arrays always use the GC to allocate their memory -- there's no getting around that. If you want something more deterministic, using std.container.Array would be the simplest manner, as I think you could pretty much drop it in where your scope vector3b array is:

Array!vector3b array

Just don't bother setting the length to zero -- the memory will be free'd once it goes out of scope (Array uses malloc/free from libc under the hood).

like image 181
Bernard Avatar answered Sep 21 '22 06:09

Bernard