1 现象:问题描述
有一次调试程序的时候总是得不到相应的结果,不知问题出现在哪里,后来发现有一个方法大体是这样定义的:
string getX()
{
...
}
然后在其它地方调用,调用的代码如下:
const char* x = getX().c_str();
std::cout << x << std::endl;
很显然,上面代码的意图是把生成的字符串显示在屏幕上,但是奇怪的是,屏幕输出的并不是我们想要的,而是些乱码。
2 关键过程:根本原因分析
调用getX()函数时,函数返回一个string类型的对象,但这个对象是个临时对象,当调用getX()语句执行完成了之后,这个对象的生命周期就结束了,对象也随之被释放。而通过它的方法c_str()取到的char*类型变量x,在string类型的临时对象释放后,就指向了一块不安全的内存区,在接下来对x的使用当然也就是错误了的。
3 结论:解决方案及效果
先声明一个string类,避免直接使用临时对象。可以将上面的代码修改如下:
string sx = getX();
const char* x = sx.c_str();
std::cout << x << std::endl;
4 经验总结:预防措施和规范建议
在使用对象的时候要考虑其生命周期。
5 备注
无。
6 考核点
对象的生命周期。
7 试题
有一个方法定义如下:
string getName()
{
string name("My Name");
return name;
}
调用该方法:
const char* localName = getName().c_str();
std::cout << localName << std::endl;
上述程序输出的结果是:
A. My Name
B. ""
C. 输出不确定
答案:C
阅读(452) | 评论(0) | 转发(0) |