Thread overview | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
January 26, 2016 how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Is there any examples that shows how to properly allocate an object of a class type with the new allocators and then release it when desired? |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Igor | On Tuesday, 26 January 2016 at 01:09:50 UTC, Igor wrote: > Is there any examples that shows how to properly allocate an object of a class type with the new allocators and then release it when desired? Allocate a block of memory big enough to hold an instance of your class using whichever allocator you need, then instantiate a class instance with std.conv.emplace. http://p0nce.github.io/d-idioms/#Placement-new-with-emplace |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Mike Parker | On Tuesday, 26 January 2016 at 05:11:54 UTC, Mike Parker wrote: > On Tuesday, 26 January 2016 at 01:09:50 UTC, Igor wrote: >> Is there any examples that shows how to properly allocate an object of a class type with the new allocators and then release it when desired? > > Allocate a block of memory big enough to hold an instance of your class using whichever allocator you need, then instantiate a class instance with std.conv.emplace. > > http://p0nce.github.io/d-idioms/#Placement-new-with-emplace I created a class using this example. But my code is now failing. It seems one can't just replace new with this and expect it to work? What is happening is some fields(strings) are not retaining their value. ubyte[__traits(classInstanceSize, App)] buffer; auto app = cast(App)emplace!App(buffer[]); //auto app = new App(); Basically the comment is the original. When I finally call createWindow, it fails because the string representing the name inside App is null... Which doesn't happen when I use new. Should it work as expected(which it isn't) or do I have to also emplace all the fields and such so they are not for some reason released? |
January 25, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Igor | On 01/25/2016 09:47 PM, Igor wrote: > it fails because the string representing the name inside App is null... > Which doesn't happen when I use new. There must be something else going on. Do you see it with a simpler type? > Should it work as expected(which it isn't) new allocates and constructs, emplace does not allocate and construct. That shold be the only difference. > or do I have to also emplace all the fields and such so they are not for > some reason released? Not at all. Ali |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Igor | V Tue, 26 Jan 2016 05:47:42 +0000 Igor via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> napsáno: > On Tuesday, 26 January 2016 at 05:11:54 UTC, Mike Parker wrote: > > On Tuesday, 26 January 2016 at 01:09:50 UTC, Igor wrote: > >> Is there any examples that shows how to properly allocate an object of a class type with the new allocators and then release it when desired? > > > > Allocate a block of memory big enough to hold an instance of your class using whichever allocator you need, then instantiate a class instance with std.conv.emplace. > > > > http://p0nce.github.io/d-idioms/#Placement-new-with-emplace > > I created a class using this example. But my code is now failing. It seems one can't just replace new with this and expect it to work? > > What is happening is some fields(strings) are not retaining their value. > > ubyte[__traits(classInstanceSize, App)] buffer; > auto app = cast(App)emplace!App(buffer[]); > //auto app = new App(); > > Basically the comment is the original. When I finally call createWindow, it fails because the string representing the name inside App is null... Which doesn't happen when I use new. > > Should it work as expected(which it isn't) or do I have to also emplace all the fields and such so they are not for some reason released? > Can you try it with GC.disable()? |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Igor | On Tuesday, 26 January 2016 at 01:09:50 UTC, Igor wrote: > Is there any examples that shows how to properly allocate an object of a class type with the new allocators and then release it when desired? There's an example of class object allocation in the std.experimental.allocator docs: // Dynamically allocate a class object static class Customer { uint id = uint.max; this() {} this(uint id) { this.id = id; } // ... } Customer cust = theAllocator.make!Customer; assert(cust.id == uint.max); // default initialized cust = theAllocator.make!Customer(42); assert(cust.id == 42); To release the object (call the destructor and free the memory), call dispose(): theAllocator.dispose(cust); You'll need to replace "theAllocator" with the allocator you want. |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Igor | On Tuesday, 26 January 2016 at 01:09:50 UTC, Igor wrote: > Is there any examples that shows how to properly allocate an object of a class type with the new allocators and then release it when desired? There are a number of different patterns discussed and illustrated with examples at http://wiki.dlang.org/Memory_Management. These don't use std.experimental.allocator, but should serve as a pretty good foundation for doing so. Mike |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozak | On Tuesday, 26 January 2016 at 09:32:06 UTC, Daniel Kozak wrote:
> V Tue, 26 Jan 2016 05:47:42 +0000
> Igor via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
> napsáno:
>
>> [...]
> Can you try it with GC.disable()?
Didn't change anything.
|
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Kozak | On Tuesday, 26 January 2016 at 09:32:06 UTC, Daniel Kozak wrote: > V Tue, 26 Jan 2016 05:47:42 +0000 > Igor via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> > napsáno: > >> On Tuesday, 26 January 2016 at 05:11:54 UTC, Mike Parker wrote: >> > [...] >> > Can you try it with GC.disable()? //ubyte[__traits(classInstanceSize, App)] buffer; auto buffer = core.stdc.stdlib.malloc(__traits(classInstanceSize, App))[0..__traits(classInstanceSize, App)]; works, so it is the ubyte line. |
January 26, 2016 Re: how to allocate class without gc? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Igor | V Tue, 26 Jan 2016 13:56:39 +0000 Igor via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> napsáno: > On Tuesday, 26 January 2016 at 09:32:06 UTC, Daniel Kozak wrote: > > V Tue, 26 Jan 2016 05:47:42 +0000 > > Igor via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> > > napsáno: > > > >> On Tuesday, 26 January 2016 at 05:11:54 UTC, Mike Parker wrote: > >> > [...] > >> > > Can you try it with GC.disable()? > > //ubyte[__traits(classInstanceSize, App)] buffer; > auto buffer = core.stdc.stdlib.malloc(__traits(classInstanceSize, > App))[0..__traits(classInstanceSize, App)]; > > works, so it is the ubyte line. > What about: auto buffer = new ubyte[__traits(classInstanceSize, App)]; |
Copyright © 1999-2021 by the D Language Foundation