Boost logo

Boost Users :

From: Rush Manbert (rush_at_[hidden])
Date: 2006-10-31 18:15:12


Aubrey, Jason wrote:
> Thanks for your suggestion Lawrence but I don't think it's related to
> the problem.
>
> I added the following after opening the file but it doesn't throw (since
> the file is valid):
> if( !file.is_open() )
> throw std::exception("Unable to open file");
>
> To prove that the file is valid:
> 1) I verified that the program creates the file
> 2) main() completes as expected.
>
> The following is in regard to Rush's comment:
>
> The call stack when trouble occurs is as follows:
> msvcr71d.dll!operator delete(void * pUserData=0x00343418)
> msvcp71d.dll!std::allocator<char>::deallocate(char *
> _Ptr=0x00343418, unsigned int __formal=48)
> msvcp71d.dll!std::string::_Tidy(bool _Built=true, unsigned int
> _Newsize=0)
> msvcp71d.dll!std::string::~string()
> TestsD.exe!$E2()
> msvcr71d.dll!doexit(int code=0, int quick=0, int retcaller=0)
> msvcr71d.dll!exit(int code=0)
> TestsD.exe!mainCRTStartup()
> kernel32.dll!7c816d4f()
> ntdll.dll!7c915b4f()
> kernel32.dll!7c8399f3()
>
> The offending code within delete() is:
> _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
>
> Unfortunately, I couldn't make any sense of the data in or near the bad
> block.
>
> Regards,
> Jason
>
> ----------------------
>
> Environment:
> OS: Win2k
> Compiler: VS7.1
> Boost: v1.33.1
>
> ----------------------
>
> #include <boost/filesystem/operations.hpp>
> #include <fstream>
>
> // Contrary to simplicity I've enhanced the following to satisfy
> suggestions
> int main(int, char**)
> {
> // Create a file
> using namespace std;
> const string fileName("/temp/test.txt");
> ofstream file;
> file.open(fileName.c_str());
> if( !file.is_open() )
> throw std::exception("Unable to open file");
> const string message("this is a test");
> file << message;
> file.close();
> const boost::filesystem::path filePath(fileName);
> const boost::intmax_t fileSize =
> boost::filesystem::file_size(filePath);
>
> if( fileSize != message.size() )
> throw std::exception("Bad result");
>
> return 0; // This line is reached without trouble
> }

I'm sorry if this sounds like a stupid question Jason, but sometimes
asking stupid questions helps. If you change the line that calls
file_size to:
        const boost::intmax_t fileSize =
static_cast<boost::intmax_t>(message.size());

then the program runs and exits cleanly?

What happens if you change the fileSize check line to this:
        size_t fileSize = (size_t)(boost::filesystem::file_size(filePath));

(Granted, this is a shot in the dark, but I can only think that this is
some sort of mixup in a typedef that messes up the stack frame. I looked
at the source for file_size() and it doesn't look like it could cause
any sort of corruption problem.)

You could also print out the addresses of all the strings, including the
one contained within the path, to try and find out which one is being
destroyed when the error occurs. I expect that the one contained in the
path is on the heap, while fileName and message are on the stack.

Oh, BTW, my OS is also Win XP, not 2K.

- Rush


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net