我有一个程序,我使用 cout 来发出调试信息。该代码在静态全局变量的初始化中执行,即在程序执行的早期执行。当我使用自己的构建脚本构建程序时,它在第一次使用 cout 时出现段错误(仅将字符串文字移入 cout,因此它不能是值)。我使用 valgrind 检查早期对无效位置的写入,但没有(并且也没有可能生成这些写入的代码,我在输出之前没有做太多事情)。当我将源代码复制到 Eclipse 项目并让 Eclipse 内置构建器构建它时,一切正常。我没有使用任何奇怪的构建器设置,只是简单地编译了-ggdb -std=c++0x
,这是仅有的两个标志。
那么,如果之前没有无效写入,那么带有字符串文字的 cout 出现段错误的原因可能是什么?构建配置如何影响这一点?
(很抱歉,我无法给您提供最小的示例,因为这个示例可以在您的计算机上正常编译,就像使用 eclipse 构建器时对我来说一样)
编辑:这是堆栈跟踪:
0x00007ffff7b6d7d1 in std::ostream::sentry::sentry(std::ostream&) () from /usr/lib /x86_64-linux-gnu/libstdc++.so.6
(gdb) backtrace
#0 0x00007ffff7b6d7d1 in std::ostream::sentry::sentry(std::ostream&) () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1 0x00007ffff7b6dee9 in std::basic_ostream<char, std::char_traits<char> >& std::__ostream_insert<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*, long) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2 0x00007ffff7b6e2ef in std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x00000000004021be inTest::fill (this=0x6120f8, funcs=...) at inTest.cpp:92
最后一帧是我的代码。第 92 行简单地写着:
std::cout << "Test";
正如 Luchian 指出的,你不能使用std::cout
在第一个之前
的实例ios_base::Init
已建成。你不必
但是,定义一个实例;包括<iostream>
应该足够了。
初始化顺序is在单个翻译单元内定义。
如果你包括<iostream>
在所有具有静态的文件的顶部
实例,你应该没问题。如果静态对象的构造函数
然而,调用另一个翻译单元中的函数,输出是
在该翻译单元中,仅包含以下内容是不够的<iostream>
仅在执行输出的翻译单元中。您必须包含它
在定义静态变量的翻译单元中。甚至
如果他们不做任何输出。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)