我将Visual Studio 2012用于一个项目和一个我出于日志记录目的而使用Log4cxx构建的版本。这两个项目都是在Debug x64中构建的,并且(我相信)可以正确链接。
两个项目的平台工具集均为Visual Studio 2012(v110),运行库为多线程调试DLL(/ MDd),Log4cxx已创建并链接为动态库(.dll)。
请考虑以下内容:
std::string szTestString = "Hello World!";
DOMConfigurator::configure(szTestString); // Call to Log4cxx.dll
在调试时,就在进入该函数之前,这是szTestString的值:
到目前为止,一切都很好。现在,我进入函数:
void DOMConfigurator::configure(const std::string& filename)
{
File file(filename);
DOMConfigurator().doConfigure(file, LogManager::getLoggerRepository());
}
当查看文件名时...
那显然是不对的。
如果我向前走一次,则会出现错误:
SampleProject.exe中位于0x000007FEFD6FBDED的未处理的异常:Microsoft C ++异常:内存位置0x000000000030F110的std :: length_error。
什么可能导致std :: string解释的更改?
编辑:当前,我在Log4cxx中添加了一个包装器以使用char *而不是std :: string,它成功了。但是问题仍然存在。
答案 0 :(得分:0)
当库在“发布”模式下编译并且您尝试在“调试”模式下运行应用程序时,通常会发生此问题。
将两个组件(即DLL和应用程序)保持在相同的模式下(发布或调试)。
确保DLL和应用程序的“代码生成”属性值都相同。