非常奇怪的行为发生在我身上。我在Windows 7 64位上分别使用最新的Cygwin32,Cygwin64和MinGW32以及GCC 4.9.2,4.9.2和4.8.1。我也在使用GCC 4.8.2在32位Linux上进行测试。
所以在所有系统上都能正常工作
#include <bits/stdc++.h>
using namespace std;
string s,t;
int main(){
cin>>s>>t;
cout<<s;
}
这是有效的
#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
string s="a",t="b";
int main(){
cin>>s>>t;
cout<<s;
}
但是在上面提到的3种配置中输入第一个字符串后,下一个在Windows上崩溃,但在Linux上正常工作:
#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
string s,t;
int main(){
cin>>s>>t;
cout<<s;
}
显然,唯一的区别是输入前字符串为空,并且_GLIBCXX_DEBUG
已启用。
首先,这是一个可重现的问题吗?即它是在具有相同配置的每台PC上发生的,还是只发生在我的PC上?第二,问题是什么?我该怎么办?我显然需要_GLIBCXX_DEBUG
来调试代码中的其他STL结构。
答案 0 :(得分:0)
_GLIBCXX_DEBUG
更改STL类的ABI(即结构布局,包括流和std::string
):
To use the libstdc++ debug mode, compile your application with the compiler
flag -D_GLIBCXX_DEBUG. Note that this flag changes the sizes and behavior of
standard class templates such as std::vector, and therefore you can only link
code compiled with debug mode and code compiled without debug mode if no
instantiation of a container is passed between the two translation units.
(来自official docs)。
您的应用(由_GLIBCXX_DEBUG
编译)将std::string
传递给std::cin::operator >>
中的libstdc++.dll
(没有此宏编译),因此违反了上述要求。此类违规通常会在运行时崩溃中体现出来:具体示例,请参见this或this。