由于访问冲突导致Boost :: Program_Options未处理的异常

时间:2011-06-28 20:57:27

标签: c++ boost boost-program-options

我有一个在DEBUG模式下运行良好的程序,但在RELEASE模式下,由于访问冲突,我得到一个未处理的异常。我很确定这不是因为空指针。这是调用堆栈:

msvcr90d.dll!memchr(unsigned char * buf=0x0000002c, unsigned char chr='', unsigned long cnt=1243588)  Line 80         Asm
msvcp90d.dll!std::char_traits<char>::find(const char * _First=0x72656d6f, unsigned int _Count=15, const char & _Ch=',')  Line 590 + 0x15 bytes     C++
msvcp90d.dll!std::basic_string<char,std::char_traits<char>,std::_DebugHeapAllocator<char> >::find(const char * _Ptr=0x0012f9e4, unsigned int _Off=0, unsigned int _Count=1)  Line 1796 + 0x2d bytes  C++
Program.exe!boost::program_options::option_description::set_name()  + 0x61 bytes   C++
Program.exe!boost::program_options::option_description::option_description()  + 0x90 bytes C++
Program.exe!boost::program_options::options_description_easy_init::operator()()  + 0x58 bytes           C++
Program.exe!CommandLineInput(int count=2, char * * vector=0x003d3360)  Line 191 + 0xac bytes          C++
Program.exe!main(int argc=4233952, char * * argv=0x00000002)  Line 65535        C++
Program.exe!__tmainCRTStartup()  Line 582 + 0x17 bytes            C

代码:

namespace po = boost::program_options;

int _tmain(int argc, _TCHAR* argv[])
{
        try
        {
            CommandInput (argc, argv); //get command line input
        }
        catch ( std::exception e )
        {
            std::cout << "WARNING: Exception is thrown" << std::endl;
            return 0;
        }
}

void CommandInput (int count, _TCHAR* vector[])
{
        po::options_description desc("Available Parameters");
        std::cout << "\n";
        desc.add_options()
            ("option1", po::value<std::string>(), "description1")
            ("option2", po::value<std::string>(), "description2")
            ("option3", po::value<std::string>(), "description3");

/*
The code breaks at the above line
*/
}

例外情况如下:

Unhandled exception at 0x1026f09b (msvcr90d.dll) in Program.exe: 0xC0000005: Access violation reading location 0x72656d6f.

2 个答案:

答案 0 :(得分:0)

有点时髦。为什么选择argc 4233952?您能否验证这不仅仅是调试器的工件?

我建议你重建你的项目,如果不能修复它,那么在加载完一切后调试程序并查看“modules”窗口。您可能正在混合不兼容的库,例如发布和调试DLL的/ EXE版本。

要特别注意已加载的CRT文件,msvcr90d等。查看已加载的所有CRT DLL的文件版本信息,并验证它们是否都具有相同的版本。

答案 1 :(得分:0)

我认为我可能面临的问题是我的程序从DEBUG CRT DLL加载符号。发生访问冲突时,不会加载RELEASE CRT DLL中的符号。我检查了我的程序中涉及的所有项目,他们都使用多线程DLL(/ MD),但它仍然使用它的调试版本。