digitalmars.D - Is there any way to make this code work?
Hi,
I'm reading http://digitalmars.com/d/2.0/memory.html
and try to combine "Free Lists" and "Explicit Class Instance Allocation".
So instead of:
void test()
{
Foo f = Foo.allocate();
...
Foo.deallocate(f);
}
I can just write as normal:
void test()
{
Foo f = new Foo();
...
delete Foo;
}
But the simple code I wrote seg faults. Is this a compiler bug? or I'm doing
something wrong? or can this thing be done at all?
Thanks.
begin 644 custom.d
M:6UP;W)T('-T9"YS=&1I;SL*:6UP;W)T('-T9"YC+G-T9&QI8CL*:6UP;W)T
M('-T9"YO=71O9FUE;6]R>3L*:6UP;W)T('-T9"YG8SL*"F-L87-S($)A<B![
M"B` ("!P=6)L:6, =F]I9"!F=6XH*2!["B` ("` ('!R:6YT9B B0F%R7&XB
M*3L*("` ('T*?0H*8VQA<W, 1F]O(#H 0F%R('L*("` ('-T<FEN9R!N86UE
M.PH*("` ('1H:7,H*2!["B` ("` ("` <')I;G1F*")M>2!C=&]R7&XB*3L*
M("` ('T*"B` ("!^=&AI<R I('L*("` ("` ("!P<FEN=&8H(FUY(&1T;W)<
M;B(I.PH ("` ("` ("\O('-U<'!O<V4 22!D;VXG="!D;R!A;GET:&EN9R!H
M97)E"B` ("!]" H ("` <'5B;&EC(&]V97)R:61E('9O:60 9G5N*"D >PH
M("` ("` ('=R:71E;&XH;F%M92D["B` ("!]" H ("` ;F5W*'-I>F5?="!S
M>BD*("` ('L*("` ("` ("!P<FEN=&8H(FUY(&YE=UQN(BD["B` ("` ("`
M1F]O(&8[" EI9B`H9G)E96QI<W0I" E[("` 9B`](&9R965L:7-T.PH)("`
M(&9R965L:7-T(#T 9BYN97AT.PH)("` (')E='5R;B!C87-T*'9O:60J*68[
M("` +R\ 22!K;F]W('1H870 8W1O<B!W:6QL(&)E(&-A;&QE9"!A9V%I;B!O
M*B!P.PH)<"`]('-T9"YC+G-T9&QI8BYM86QL;V,H<WHI.PH):68 *"%P*0H)
M("` ('1H<F]W(&YE=R!/=71/9DUE;6]R>45X8V5P=&EO;B I.PH)+R]S=&0N
M9V,N861D4F%N9V4H<"P <"`K('-Z*3L*"7)E='5R;B!P.PH ("` ?0H*("`
M(&1E;&5T92AV;VED*B!P*0H ("` >PH ("` ("` ('!R:6YT9B B;7D 9&5L
M7&XB*3L*("` ("` ("`O+R!S=7!P;W-E($D :G5S="!S879E(&ET(&9O<B!R
M975S92P :6YS=&5A9"!O9B!F<F5E(&UE;6]R>0H ("` ("` ($9O;R!F(#T
M8V%S="A&;V\I<#L*("` ("` ("!D96%L;&]C871E*&8I.PH ("` ("` ('!R
M:6YT9B B<V%V960A7&XB*3L*("` ("` ("`O+R!T<GD =&\ 8V%L;"!S;VUE
M(&UE=&AO9"P <V5E(&EF(&ET('-T:6QL('=O<FMS. H ("` ("` (&8N9G5N
M*"D[("`O+R!396=M96YT871I;VX 9F%U;'0 :&5R92X 27, =&AE<F4 86YY
M('=A>2!T;R!M86ME('1H:7, =V]R:S\*("` ("` ("`O+R!)(')U;B!T:')U
M('1H92!D96)U9V=E<BP 86YD(&9O=6YD(&8G<R!A='1R:71U8F4 :7, ;F]T
M(&-H86YG960N"B` ("` ("` +R\ <V\ =VAA="=S(&=O:6YG('=R;VYG/PH
M("` ("` ("\O(&ES('1H:7, 8F5C875S92!E=F5N(&%F=&5R($D <')O=FED
M960 ;7D ;W=N("=D96QE=&4G(&%N9"`G?G1H:7,G+`H ("` ("` ("\O(&-O
M;7!I;&5R('-T:6QL(&EN<V5R=&5D('-O;64 97AT<F$ 8VQE86YU<"!C;V1E
M/PH ("` ?0H*("` ('-T871I8R!&;V\ 9G)E96QI<W0["0DO+R!S=&%R="!O
M9B!F<F5E(&QI<W0*"B` ("!S=&%T:6, =F]I9"!D96%L;&]C871E*$9O;R!F
M*0H ("` >PH)9BYN97AT(#T 9G)E96QI<W0[" EF<F5E;&ES="`](&8["B`
M("!]" H ("` 1F]O(&YE>'0["0DO+R!F;W( =7-E(&)Y($9O;T9R965,:7-T
M"GT*"FEN="!M86EN*"D >PH ($9O;R!F;V\["B` 9F]O(#T ;F5W($9O;R I
M.PH (&9O;RYN86UE(#T (F]L9"UG=7DB.PH (&9O;RYF=6XH*3L*("!D96QE
M=&4 9F]O.PH*("!F;V\ /2!N97< 1F]O*"D["B` 9F]O+F9U;B I.PH*("!R
,971U<FX ,#L*?0H*
`
end
Aug 15 2008
== Quote from z (z gg.com)'s article
Hi,
I'm reading http://digitalmars.com/d/2.0/memory.html
and try to combine "Free Lists" and "Explicit Class Instance Allocation".
So instead of:
void test()
{
Foo f = Foo.allocate();
...
Foo.deallocate(f);
}
I can just write as normal:
void test()
{
Foo f = new Foo();
...
delete Foo;
}
But the simple code I wrote seg faults. Is this a compiler bug? or I'm doing
something wrong? or can this thing be done at all?
Thanks.
<< custom.d >>
the code:
$ cat custom.d
import std.stdio;
import std.c.stdlib;
import std.outofmemory;
import std.gc;
class Bar {
public void fun() {
printf("Bar\n");
}
}
class Foo : Bar {
string name;
this() {
printf("my ctor\n");
}
~this() {
printf("my dtor\n");
// suppose I don't do anything here
}
public override void fun() {
writeln(name);
}
new(size_t sz)
{
printf("my new\n");
Foo f;
if (freelist)
{ f = freelist;
freelist = f.next;
return cast(void*)f; // I know that ctor will be called again on
f.
Is there any way to skip :-) ?
}
void* p;
p = std.c.stdlib.malloc(sz);
if (!p)
throw new OutOfMemoryException();
//std.gc.addRange(p, p + sz);
return p;
}
delete(void* p)
{
printf("my del\n");
// suppose I just save it for reuse, instead of free memory
Foo f = cast(Foo)p;
deallocate(f);
printf("saved!\n");
// try to call some method, see if it still works:
f.fun(); // Segmentation fault here. Is there any way to make this
work?
// I run thru the debugger, and found f's attritube is not changed.
// so what's going wrong?
// is this because even after I provided my own 'delete' and '~this',
// compiler still inserted some extra cleanup code?
}
static Foo freelist; // start of free list
static void deallocate(Foo f)
{
f.next = freelist;
freelist = f;
}
Foo next; // for use by FooFreeList
}
int main() {
Foo foo;
foo = new Foo();
foo.name = "old-guy";
foo.fun();
delete foo;
foo = new Foo();
foo.fun();
return 0;
}
Aug 15 2008
== Extrait de l'article de « z (z gg.com) »== Quote from z (z gg.com)'s article;Hi, I'm reading http://digitalmars.com/d/2.0/memory.html and try to combine "Free Lists" and "Explicit Class Instance Allocation".class Bar { public void fun() { printf("Bar\n"); } } class Foo : Bar {It would be easier of you split them up in two objects not inheriting from one another. class Bar {} //Use Explicit Class Instance Allocation here class BarFreeList {} //And free list here. Hmm maybe even a template.
Aug 16 2008








Sclytrack <sclytrack pi.be>