cin在Windows上没有使用空字符串when_GLIBCXX_DEBUG?

时间:2015-02-25 00:05:34

标签: c++ gcc cygwin mingw

非常奇怪的行为发生在我身上。我在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结构。

1 个答案:

答案 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(没有此宏编译),因此违反了上述要求。此类违规通常会在运行时崩溃中体现出来:具体示例,请参见thisthis