Jump to page: 1 2
Thread overview
how to allocate class without gc?
Jan 26, 2016
Igor
Jan 26, 2016
Mike Parker
Jan 26, 2016
Igor
Jan 26, 2016
Ali Çehreli
Jan 26, 2016
Daniel Kozak
Jan 26, 2016
Igor
Jan 26, 2016
Igor
Jan 26, 2016
Daniel Kozak
Jan 26, 2016
Marc Schütz
Jan 26, 2016
Guillaume Piolat
Jan 26, 2016
Adrian Matoga
Jan 26, 2016
Mike
Jan 27, 2016
Basile B.
Jan 27, 2016
Igor
Jan 28, 2016
Kagamin
Jan 28, 2016
Basile B.
January 26, 2016
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
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
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
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
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
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
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
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
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
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)];

« First   ‹ Prev
1 2