变量损坏c++字符串Visual Studio 2005

Variable Corruption C++ String Visual Studio 2005

本文关键字:Studio 2005 Visual 字符串 损坏 c++ 变量      更新时间:2023-10-16

我有以下代码在我的项目。

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:它们可能是相同大小的不同定义。