March 25, 2021 Re: How to delete dynamic array ? | ||||
---|---|---|---|---|
| ||||
Posted in reply to H. S. Teoh | On Tuesday, 16 March 2021 at 23:49:00 UTC, H. S. Teoh wrote: > On Tue, Mar 16, 2021 at 11:28:00PM +0000, mw via Digitalmars-d-learn wrote: [...] >> suppose: >> >> double[] data; // D type: dynamic array >> >> As of 2021 what's the correct way to allocate and deallocate (free memory to the system immediately) D's dynamic array? > [...] > > Note that T[] is just a slice, not the dynamic array itself. The dynamic array is allocated and managed by the GC when you append stuff to it, or when you create a new array with `new` or an array literal. > > None of the latter, however, precludes you from using T[] for memory that you manage yourself. For example, you could do this: > > double[] data; > data = cast(double[]) malloc(n * double.sizeof)[0 .. n]; correction: this should be: n *= double.sizeof; data = cast(double[])(malloc(n)[0 .. n]); // i.e. slice n == malloc n > Now you have a slice to memory you allocated yourself, and you have to manage its lifetime manually. When you're done with it: > > free(data.ptr); > data = []; // null out dangling pointer, just in case > > The GC does not get involved unless you actually allocate from it. As long as .ptr does not point to GC-managed memory, the GC will not care about it. (Be aware, though, that the ~ and ~= operators may allocate from the GC, so you will have to refrain from using them. @nogc may help in this regard.) > > > T |
Copyright © 1999-2021 by the D Language Foundation