C及标准库中的那些大坑,别踩了

C++及标准库中,其实存在了一些大坑,你都知道怎么避免吗?

1.变量初始化

这是使用C++11codecvt时遇到的一个坑,转换编码时,mbstate_t这个中间状态变量,必须初始化为0,否则运行出错,即:

这是第一个坑,并不算太坑,还比较容易调试和发现,也怪自己大意了。

经验:C++中的变量一定要初始化后再使用。

2.匿名std::thread对象

这个坑要和boost进行比较,在boost中,是可以创建匿名thread对象的,并且这样的匿名对象跟future、promise是可以正常配合使用的(《Boost标准库完全开发指南》一书中的示例代码就是这样写的)。

但是,在C++标准库中不能这么干,会出现莫名其妙的错误,调试时也不会显示任何有价值的信息,最终确定这个问题真是费了我好大劲,因为根本没想到会是这个问题,毕竟boost里都正常使用了。

经验:尽量不使用匿名对象,如果想要用完立即释放,可以使用单独的代码块包裹。

3.线程局部存储(TLS)

这是一个坑了我一天的大坑。

C++11中,新引入了thread_local存储类型,等同于之前的__declspec(thread),由于其具有真正的可移植性,所以我就尝试使用了,但这也是噩梦的开始。

我有一段代码,如果编译为exe,在xp系统上能正常运行,但如果编译为dll,在xp上运行就出错。由于xp上不能安装VS这种高科技玩意,只能用x32_dbg凑合调试,发现是空指针异常,指针来源为fs:[2c],这是TLS指针啊,然后百度,找到了微软的文档







































足疗保健足疗11大好处别错过
福建日报要闻2版仙游将三严三实要



转载请注明:http://www.nydjfy.com/jyqj/1426.html

  • 上一篇文章:
  •   
  • 下一篇文章: