Gide Nwawudu wrote:
On Wed, 28 Jan 2009 13:37:40 -0800, Charles Hixson
<charleshi...@earthlink.net> wrote:
Gide Nwawudu wrote:
On Tue, 27 Jan 2009 22:48:33 -0800, Charles Hixson
<charleshi...@earthlink.net> wrote:
Main routine:
void main()
{
try
{ BlockFile bf;
bf = new BlockFile ("test.bf", 4096);
writefln ("before close");
bf.close;
bf = null;
writefln ("after close");
BlockFile cf = new BlockFile ("test.bf", 4096);
writefln ("after second open");
}
catch (Exception e)
{ writefln ("Caught Exception ", e); }
}
Results in:
Exiting BlockFile::this
before close
after close
Exiting BlockFile::this
after second open
Segmentation fault
I could post all the code. It's only 146 lines. But perhaps this is
enough?
I'm thinking it might be an issue with close and the dtor being called
on the same object. If you add std.gc.fullCollect() after the bf =
null. Does that make the code seg fault before 'after close' is
written?
Gide
I had to wriggle the code around a bit. (It's D2 not D1.) However it
didn't make any difference to do:
void main()
{
try
{ BlockFile bf;
bf = new BlockFile ("test.bf", 4096);
writefln ("before close");
bf.close;
bf = null;
GC.collect;
writefln ("after close");
BlockFile cf = new BlockFile ("test.bf",
4096);
writefln ("after second open");
}
catch (Exception e)
{ writefln ("Caught Exception ", e); }
}
-------------------
And the docs say that GC.collect does a full collect;
P.S.: Attached is the full listing
Calling close and dtor on BufferedFile is the problem. Rewiting
BlockFile.close as follows fixes the problem, but I think your code
should work.
void close() { delete bf; bf = null; }
Gide
I replaced BlockFile.close with:
void close()
{ if (bf !is null) delete bf; // bf.close;
bf = null;
}
But that didn't alter the segmentation fault. (Did you try it under D1
or D2?)