C++ 变量损坏C++;字符串Visual Studio 2005
我的项目中有以下代码C++ 变量损坏C++;字符串Visual Studio 2005,c++,string,variables,visual-studio-2005,memory-corruption,C++,String,Variables,Visual Studio 2005,Memory Corruption,我的项目中有以下代码 g(const string& str) { printf("%s", str.c_str()); } f() { string str("whatever"); g(str); } 它是非常大的代码的一部分。g()位于dll中,并导出api。f()是可执行文件的一部分。这段代码过去工作得很好。但现在它只在调试配置中工作,而不在发布配置中工作。我试着调试,发现只要我点击了g()str的第一条语句,内容就消失了。所以它打印空 发布配置
g(const string& str)
{
printf("%s", str.c_str());
}
f()
{
string str("whatever");
g(str);
}
它是非常大的代码的一部分。g()位于dll中,并导出api。f()是可执行文件的一部分。这段代码过去工作得很好。但现在它只在调试配置中工作,而不在发布配置中工作。我试着调试,发现只要我点击了g()str的第一条语句,内容就消失了。所以它打印空
发布配置没有更改
请帮忙
致以最良好的祝愿,
Shiv黑暗中的狂野镜头:
您使用不同的编译器标志编译了DLL和程序,不同之处在于STL的实现不同(可能您在其中一个中使用了检查迭代器,但在另一个中没有使用检查迭代器…)。这违反了ODR,将导致未定义的行为
基本上,一端将创建对象的版本,并将引用传递给另一端,但另一端将尝试以不同的方式解释内存
如果是这种情况,您应该能够确定调用者和被调用者中字符串的地址相同,并且该地址中的内存具有与调用代码中的sizeof(std::string)
相同的位模式。如果是这种情况,并且两端对字符串的解释都不同,那么就存在ODR冲突。使用相同的编译器标志重新编译所有项目
另一个提示是,如果主程序和DLL(或不同DLL)中的
sizeof(std::string)
的值不同,则有两种定义。如果大小不同,则表明存在ODR冲突。大小相同不能用来断言ODR没有被违反:它们可能是具有相同大小的不同定义。投票关闭:您应该尝试减少原始代码,直到您意识到失败的地方。这个问题无法回答,因为发布的代码没有表现出这种行为。答案是代码中的某个地方出了问题,但这几乎不是建设性的。请注意(这可能是问题所在),如果使用不同的标志编译主程序和dll,STL的定义可能不同,这将导致违反ODR和未定义的行为。这听起来像是构建问题(可能与链接器有关)。我的建议:(1)做一个干净的重建;(2) 确保DLL和主程序均以发布模式构建;(3) 确保在运行主程序时始终选择正确的DLL;(4) 即使你说发行版配置没有改变,也要仔细检查这是真的。这很可能是真的。请注意,可以使用Dependency Walker()查看不同DLL使用的运行时。(但不适用于静态链接的内容。)