变量损坏c++字符串Visual Studio 2005
Variable Corruption C++ String Visual Studio 2005
我有以下代码在我的项目。
g(const string& str)
{
printf("%s", str.c_str());
}
f()
{
string str("whatever");
g(str);
}
它是非常大的代码的一部分。G()在DLL中,API被导出。F()是可执行文件的一部分。这段代码过去工作得很好。但是现在它只能在调试配置中工作,而不能在发布配置中工作。我试着调试,发现只要我点击g()的第一条语句,str内容就消失了。所以输出null
发布配置没有改变。
请帮助。
最诚挚的问候,Shiv
夜景:
你已经用不同的编译器标志编译了DLL和程序,在不同的情况下,STL的实现是不同的(也许你在一个中使用检查迭代器,而不是另一个…)。这违反了ODR,并将导致未定义的行为。
基本上一端会创建自己的对象版本,并将引用传递给另一端,但另一端会尝试以不同的方式解释内存。
如果是这种情况,您应该能够确定调用者和被调用者中的字符串地址是相同的,并且该地址中的内存具有与调用代码中的sizeof(std::string)
相同的位模式。如果是这种情况,并且两端对字符串的解释不同,则存在ODR冲突。用完全相同的编译器标志重新编译所有的项目。
另一个提示是,如果sizeof(std::string)
的值在主程序和DLL中(或在不同的DLL中)不同,则有两个定义。如果大小不同,则告诉您存在ODR违规。大小相同不能用来断言没有违反ODR:它们可能是相同大小的不同定义。
相关文章:
- 无法在Visual Studio 2005中构建Qt项目
- 是否可以在Windows 8环境上在Visual Studio 2005上运行VC ,Win32应用程序
- 如何使用 Visual Studio 2005 获取两个不同 c++ 程序之间的返回值
- 将 coverity SA 与 Visual Studio 2005 集成的步骤以及如何运行相同的步骤
- 用于在 Visual Studio 2005 中编译 Win32 "hello world"的命令行
- 如何在 Windows for Visual Studio 2005 上设置 WXWIDGETS
- MSBuild、未解析的外部项和Visual Studio 2005
- 在Visual Studio 2005中自动更新版本号(C++/C#)
- Visual Studio 2005中的Lambda函数替换--Boost库
- 在 Visual Studio 2005 中调试时显示环境变量
- visual studio 2005 C++ include path
- 从Visual Studio 2005移植到2008或更高版本
- Visual Studio 2005在我使用GSoap生成的soapclient.cpp中引发生成错误
- 如何使用visual studio 2005从命令行编译
- OCCI应用程序在Visual Studio 2005的调试模式下运行时会崩溃
- 如何将项目从Visual Studio 2005迁移到Visual Studio 2012
- 在哪里找到visual studio 2005的远程调试器
- Visual studio 2005在watch变量时崩溃
- Visual Studio 2005/08/10会取代嵌入式Visual c++ 4.0吗?
- MS Visual Studio 2005 c++异常处理