std::cout和printf
2013-06-26 13:58
369 查看
禁止std::cout和printf混用,在多线程环境下可能导致coredump。
说明:printf和std::cout分别为标准c语言与c++中的函数,两者的缓冲区机制不同(printf无缓冲区,而std::cout有),而且对于标准输出的加锁时机也略不同:
(1)printf:在对标准输出作任何处理前先加锁。
(2)std::cout:在实际向标准输出打印时方才加锁。
两者存在微弱的时序差别,而多线程环境下,很多问题就是由于微弱的时序差别造成的。所以两者的混用很容易带来不可预知的错误,常见的错误有打印输出的结果不符合预期,而严重错误时甚至会导致内部缓冲区溢出,导致coredump。
例如:
void Nocomplaint()
{
int j=0;
for(j=0;j<5;j++)
{
cout << "j=";
printf("%d\n",j);
}
}
上面代码的输出结果可能为:1 2 3 4 j=j=j=j=j=
造成这样的错误的原因就是std::cout的标准流输出时带有缓冲区的,如果没有及时清理缓冲区而在期间采用了其他系统的输出函数。可能会暴露两种输出函数的不兼容性,从而出现非预期错误。
说明:printf和std::cout分别为标准c语言与c++中的函数,两者的缓冲区机制不同(printf无缓冲区,而std::cout有),而且对于标准输出的加锁时机也略不同:
(1)printf:在对标准输出作任何处理前先加锁。
(2)std::cout:在实际向标准输出打印时方才加锁。
两者存在微弱的时序差别,而多线程环境下,很多问题就是由于微弱的时序差别造成的。所以两者的混用很容易带来不可预知的错误,常见的错误有打印输出的结果不符合预期,而严重错误时甚至会导致内部缓冲区溢出,导致coredump。
例如:
void Nocomplaint()
{
int j=0;
for(j=0;j<5;j++)
{
cout << "j=";
printf("%d\n",j);
}
}
上面代码的输出结果可能为:1 2 3 4 j=j=j=j=j=
造成这样的错误的原因就是std::cout的标准流输出时带有缓冲区的,如果没有及时清理缓冲区而在期间采用了其他系统的输出函数。可能会暴露两种输出函数的不兼容性,从而出现非预期错误。
相关文章推荐
- Android如何打印std::cout/printf(重定向stdout)
- std::cout和printf
- std::cout和printf
- 在MFC程序中使用到printf,std::cout输出调试
- 解开一个困扰自己多时的小问题——从std::cout和endl说起
- 解开一个困扰自己多时的小问题——从std::cout和endl说起
- 全排列 利用template的时候,用cout打印不需要考虑变量的类型,这点比printf好用
- 使用std::copy将std::map输出到std::cout
- : error: ‘cout’ is not a member of ‘std’
- if,while,std::cin,std::cout用法练习
- 关于cout和printf的压栈顺序问题
- qt std::cout 中文乱码
- C++ 入门教程(五) 使用 std::cout 输出和数字分位符的使用
- Q:cout和printf?
- scanf&printf VS cin&cout
- C/C++中printf和C++中cout的输出格式
- C++中cout和printf在vc6.0中的区别
- 解开一个困扰自己多时的小问题——从std::cout和endl说起
- 解开一个困扰自己多时的小问题——从std::cout和endl说起
- cout printf 莫明奇妙的崩溃问题