临时对象

 

    在代码中经常会使用ostringstream格式化字符串,用ostringstream.str()取得格式化后的结果字符串,但ostringstream.str()返回的是一个临时对象,在代码中必须注意临时对象的生存时间。

(vs2005)ostringstream类成员函数str()的定义为: 

_Mystr __CLR_OR_THIS_CALL str()  const
{    // return string copy of character array
    return (_Stringbuffer.str());
}

_Stringbuffer定义为:

_Mysb _Stringbuffer;

typedef basic_stringbuf
< _Elem, _Traits, _Alloc >  _Mysb;

basic_stringbuf::str()定义为:

_Mystr __CLR_OR_THIS_CALL str()  const
    
{    // return string copy of character array
        if (!(_Mystate & _Constant) && _Mysb::pptr() != 0)
    
{    // writable, make string from write buffer
        _Mystr _Str(_Mysb::pbase(), (_Seekhigh < _Mysb::pptr()
            
? _Mysb::pptr() : _Seekhigh) - _Mysb::pbase());
        
return (_Str);
        }

    
else if (!(_Mystate & _Noread) && _Mysb::gptr() != 0)
        
{    // readable, make string from read buffer
        _Mystr _Str(_Mysb::eback(), _Mysb::egptr() - _Mysb::eback());
        
return (_Str);
        }

    
else
        
{    // inaccessible, return empty string
        _Mystr _Nul;
        
return (_Nul);
        }

    }

最后返回的都是一个临时对象。

用vs2005测试,程序如下:

#include  < iostream >  
#include 
< sstream >
using   namespace  std;


int  main() 

 ostringstream ss;
 ss 
<< "hello " << endl;

 cout 
<< "ss: " << ss.str().c_str();
 
 
const char* p = ss.str().c_str();
 cout 
<< "p: " << p;
 cout 
<< endl;

 
return 0;
}


输出:

ss: hello
p:

 ss.str()返回的临时对象实际上在“const char* p = ss.str().c_str()”执行完就释放了,所以“cout << p”没有任何输出。这里“cout << p”输出为空只是巧合,也可能输出为乱码。
 
解决方法:
1.用string对象存储
 string str = ss.str();
 cout << str.c_str();
 
2.用const引用这个临时对象,可将临时变量的生存期延长到const 变量的作用域结束
 const string& str = ss.str();
 cout << str.c_str();
 

ps:

    baidu找资料的时候搜索到这个链接:http://www.cppblog.com/chengmeng/archive/2006/09/04/12024.html,在评论栏里赫然有连文兄的大名。顺藤摸瓜,找到他的blog:http://www@cppblog@com/wlwlxj/。哈哈,沧海一声笑,世界真奇妙。看了他和婧姐的事情,唏嘘不已。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值