Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 变量损坏C++;字符串Visual Studio 2005_C++_String_Variables_Visual Studio 2005_Memory Corruption - Fatal编程技术网

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使用的运行时。(但不适用于静态链接的内容。)