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?)

Reply via email to