Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543075
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 18:41:58

方法一:
SString strMessageID = rSrvSessWrapper->GetXMmsMessageID();
const char * pMessageID = strMessageID.p_str();
这里新定义了一个变量strMessageID,将函数的返回值拷贝到该变量中,然后让pMessageID指向该变量的内容。由于该变量可以一直存活到函数退出,因此不会带来上述的问题。
方法二:
去除原来的CSrvSession::GetXMmsMessageID()方法,增加一个新的Session方法,直接返回MessageID的地址:
const char *  CSrvSession::GetszXMmsMessageID()
{
    return(&m_szXMmsMessageID[0]);
};
然后修改pMessageID的引用:
const char * pMessageID = rSrvSessWrapper->GetszXMmsMessageID();
这里直接返回了Session中的字段的地址,该地址指向的内存在Session存活期间一直存在,不会产生上述问题。
方法三:
修改Session定义及const SString  CSrvSession::GetXMmsMessageID()方法:
 
        //char  m_szXMmsMessageID[DEF_SRV_MESSAGE_ID_LEN + 1];
        SString  m_strXMmsMessageID;
 
const SString & CSrvSession::GetXMmsMessageID() const
{
    return m_strXMmsMessageID;
};
这里GetXMmsMessageID()函数返回的是Session中字段的引用,不会引入临时变量,也不会导致上述问题的产生。
第一种方案的效率太差,基本可以不考虑。第三种方案的好处在于可以维持原有的接口不变,不变在程序中大量的更改代码,且可以防止以后调用GetXMmsMessageID()函数是犯类似的错误;缺点是会多占用内存,和SERVER以前的优化过程相违背。最好的解决方案应该是第二种,但它需要大量的工作。
4 经验总结:预防措施和规范建议
1.     小心临时变量
2.     在引用指针时一定要注意其指向的内容是否还存在
5 备注
6 考核点
临时变量
7 试题
#include
#include
using namespace std;
void main()
{
 cout << Test() << endl;
}
请选择正确的调用函数(要求输出test): CD
A.
string &Test()
{   
    return "test";
}
B.
string &Test()
{
    return string("test");
}
C.
string Test()
{
    return "test";
}
D.
string Test()
{
    return string("test");
}
阅读(254) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~