1 现象:问题描述
在一次版本转测后,有好几个问题单被提了过来,都是严重问题,有core文件,经过gdb查看core信息,发现在生成空字符串std::string对象时,程序运行出现了coredump。都是采用如下的方式初始化:
std::string s(NULL);
2 关键过程:根本原因分析
在STL的实现中,std::string对象在初始化时,会计算传入的char*字符串的长度,其实现如下:
static size_t _STLP_CALL length(const char* __s) { return strlen(__s); }
如果调用strlen()函数时,传入的NULL值,就会造成coredump。
3 结论:解决方案及效果
将std::string s(NULL);语句修改为:
std::string x("");
修改后问题得到解决。
4 经验总结:预防措施和规范建议
使用std::string类时,如果要初始化std::string为空串的话,可以有两种方法:
(1)使用""来初始化: std::string x("");
(2)使用std::string的缺省构造函数来进行初始化:std::string x;
由于第二种方案依赖于std::string在具体STL中的实现,不推荐使用。
5 备注
无。
6 考核点
std::string类的使用。
7 试题
生成表示空字符串的std::string对象,下面的哪些方案是安全的方案:
(1)std::string x("");
(2)std::string x;
(3)std::string s(NULL);
答案:(1)(2)
阅读(749) | 评论(0) | 转发(0) |