Thread overview | |||||||
---|---|---|---|---|---|---|---|
|
February 26, 2014 Allocating and freeing memory like this? | ||||
---|---|---|---|---|
| ||||
Hello, ich found this article on the Internet that explains how to do malloc and free in D: http://fgda.pl/post/8/a-look-at-the-d-programming-language See the functions named _new and _delete. My question is whether this is really the way to allocate and free some memory for a class manually in D. Because I just did this playing around with D and it seems to work: class D { public int i; } void main(string[] args) { auto d = new D(); delete(d); d.i = 123; // creates Access Violation as expected } The article confused me. Is the contents outdated or am I messing something up? Thanks for shedding any light on this for me ;-). Regards, Bienlein |
February 26, 2014 Re: Allocating and freeing memory like this? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bienlein | I can't remember where I read it though, in documentation probably, the `free` function calls the `delete` function as well, and it can be used to remove object from memory. Since there is garbage collector in the background already, you don't have to do it in this way (and I am not doing as well), but you are able. While writing the message, found the documentation. http://dlang.org/phobos/core_memory.html#.GC.free On Wednesday, 26 February 2014 at 09:14:42 UTC, Bienlein wrote: > Hello, > > ich found this article on the Internet that explains how to do malloc and free in D: http://fgda.pl/post/8/a-look-at-the-d-programming-language See the functions named _new and _delete. My question is whether this is really the way to allocate and free some memory for a class manually in D. Because I just did this playing around with D and it seems to work: > > class D { > public int i; > } > > void main(string[] args) > { > auto d = new D(); > delete(d); > > d.i = 123; // creates Access Violation as expected > } > > The article confused me. Is the contents outdated or am I messing something up? > > Thanks for shedding any light on this for me ;-). > Regards, Bienlein |
February 26, 2014 Re: Allocating and freeing memory like this? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tolga Cakiroglu | I noticed that the `delete` function is not in that link. Anyway, there are some discussions about the `delete` function already. http://forum.dlang.org/thread/bmipphidczppnllpincm@forum.dlang.org#post-mailman.1327.1351300092.5162.digitalmars-d-learn:40puremagic.com On Wednesday, 26 February 2014 at 09:19:55 UTC, Tolga Cakiroglu wrote: > I can't remember where I read it though, in documentation probably, the `free` function calls the `delete` function as well, and it can be used to remove object from memory. > > Since there is garbage collector in the background already, you don't have to do it in this way (and I am not doing as well), but you are able. > > While writing the message, found the documentation. http://dlang.org/phobos/core_memory.html#.GC.free |
February 26, 2014 Re: Allocating and freeing memory like this? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bienlein | On Wednesday, 26 February 2014 at 09:14:42 UTC, Bienlein wrote: A similar approach is already employed in phobos, see http://dlang.org/phobos/std_typecons.html#.scoped > The article confused me. Is the contents outdated or am I messing something up? Regarding keywords new and delete: http://dlang.org/class.html#allocators. Read the Notes carefully :) In a nutshell, 'delete' keyword will eventually go away entirely, and it won't be allowed to redefine 'new'. Regarding the code in the article: import std.stdio, std.conv, core.stdc.stdlib; T _new(T, Args...) (Args args) { size_t objSize = __traits(classInstanceSize, T); void* tmp = core.stdc.stdlib.malloc(objSize); if (!tmp) throw new Exception("Memory allocation failed"); Calling 'new Exception' when memory allocation failed is a bad idea. There is std.exception.onOutOfMemoryError() function for such cases. void _delete(T)(T obj) { clear(obj); destroy(obj) should be used instead. It's possible that some new idioms will come up once std.allocator arrives into Phobos. |
February 26, 2014 Re: Allocating and freeing memory like this? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Bienlein | On Wednesday, 26 February 2014 at 09:14:42 UTC, Bienlein wrote: > Hello, > > ich found this article on the Internet that explains how to do malloc and free in D: http://fgda.pl/post/8/a-look-at-the-d-programming-language See the functions named _new and _delete. My question is whether this is really the way to allocate and free some memory for a class manually in D. Because I just did this playing around with D and it seems to work: > > class D { > public int i; > } > > void main(string[] args) > { > auto d = new D(); > delete(d); > > d.i = 123; // creates Access Violation as expected > } > > The article confused me. Is the contents outdated or am I messing something up? > > Thanks for shedding any light on this for me ;-). > Regards, Bienlein You need to clarify if you want to allocate on the managed heap (managed by the garbage collector) or the unmanaged heap (managed by you with malloc and free) The _new and _delete methods in the article use an outdated syntax as class allocators[1] (read "new") and deallocators[2] (read "delete") are scheduled for deprecation. There is also an article[3] here on dlang.org that also shows and example of this, but it also uses the old syntax. Coincidently, I just posted some code[4] on the digitalmars.D list asking for some help updating that very example. I intend to submit a pull request to update it in the next day or two. Mike [1] http://dlang.org/class.html#deallocators [2] http://dlang.org/class.html#allocators [3] http://dlang.org/memory.html#newdelete [4] http://forum.dlang.org/post/zxswyzstaepsatiyjjdt@forum.dlang.org |
Copyright © 1999-2021 by the D Language Foundation