$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: David Walthall (walthall_at_[hidden])
Date: 2006-11-01 12:02:49
Aubrey, Jason wrote:
> Hi,
> 
> When I run the following program it runs successfully but throws an
> exception during shutdown.  I don't know why, but it seems that the call
> to boost::filesystem::file_size() is corrupting memory somehow.  This
> example only shows the call to file_size() but I think I've seen similar
> trouble with other calls within boost::filesystem.  
> 
> Am I doing something wrong here or is this a bug?
> 
> Regards,
> Jason Aubrey
Jason,
When something like this happens, I have a function that checks all of 
the heap for corruption errors.  If you place enough calls to this 
function, you can use it to find where the corruption happens.
David
#include <malloc.h>
#include <stdlib.h>
// HeapCheckWin32()
// ----------------
// Sends an output to the TRACE() function with the
// status of the heap.  (Actually, it seems to hit
// an assert inside of _heapwalk when there is an error.)
// Returns 0 for ok, non-zero for error.
int HeapCheckWin32()
{
     _HEAPINFO hinfo;
     int heapstatus;
     int retStatus = 1; // start with error status
     hinfo._pentry = NULL;
     do
     {
         heapstatus = _heapwalk(&hinfo);
     } while(heapstatus == _HEAPOK);
     switch(heapstatus)
     {
         case _HEAPEMPTY:
             TRACE("OK - empty heap\n");
             retStatus = 0;
             break;
         case _HEAPEND:
             TRACE("OK - end of heap\n");
             retStatus = 0;
             break;
         case _HEAPBADPTR:
             TRACE("ERROR - bad pointer to heap\n");
             retStatus = 1;
             break;
         case _HEAPBADBEGIN:
             TRACE("ERROR - bad start of heap\n");
             retStatus = 1;
             break;
         case _HEAPBADNODE:
             TRACE("ERROR - bad node in heap\n");
             retStatus = 1;
             break;
         default:
             retStatus = 2;
             break;
     }
     return retStatus;
}