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

Reply via email to