我有以下代码在我的项目。
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:它们可能是相同大小的不同定义。