Segmentation error at the end problem (148 line program listing)

Charles Hixson charleshixsn at earthlink.net
Thu Jan 29 10:01:03 PST 2009


Gide Nwawudu wrote:
> On Wed, 28 Jan 2009 13:37:40 -0800, Charles Hixson
> <charleshixsn at earthlink.net> wrote:
> 
>> Gide Nwawudu wrote:
>>> On Tue, 27 Jan 2009 22:48:33 -0800, Charles Hixson
>>> <charleshixsn at 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?)


More information about the Digitalmars-d-learn mailing list