strstream 教训

用stringstream替换strstream!

 

strstream构造后,如果去访问str()获得缓冲区指针后,要手工去释放它。

    strstream ss;
    ss.precision(16);
    ss<<" NOT(";
    ss<<"(MYRIGHT > MYLEFT) AND (MYRIGHT-MYLEFT) < "<<filterSize;
    ss<<" AND (MYTOP > MYBOTTOM) AND (MYTOP-MYBOTTOM) < "<<filterSize;
    ss<<")"<<ends;

    ss.str();//一写这行内存就不断增加!!!

    需要手工delete ss.str();

 

参看:

如果使用自动分配存储空间的方法,则使用无参的构造函数:
   ostrstream os;
   这时对象os在堆中分配一块存储空间,并自己维护。当用户输入不断增加,原存储块不够用时,它可以再分配更多的存储空间。用户可以通过调用成员函数rdbuf()返回缓冲区指针,以访问缓冲区的内容。

ostrstream类支持一个字符数组作为数据传输目的地的输出流,它可以使用我们为它申请的存储空间,这时字节在内存中被格式化;也可以使用自动分配的存储空间。
   我们为ostrstream申请存储空间的方法是通过ostrstream有参的构造函数:
   ostrstream(char*, int, int=ios::out);
   当插入操作超过申请的存储空间的小时,流的bad标志会置位。
   如果使用自动分配存储空间的方法,则使用无参的构造函数:
   ostrstream os;
    当不知道数据需要多少空间时,这是一种很好的方法。这时对象os在堆中分配一块存储空间,并自己维护。当用户输入不断增加,原存储块不够用时,如果有必 要,它将移动存储块以分配更多的存储空间。用户可以通过调用成员函数rdbuf()返回缓冲区指针,以访问缓冲区的内容。但是有一个问题:当空间不够,流 对象自己移动存储块以分配更多空间时,原来的缓冲区指针已经失效,但是用户是不知道的,因为流对象自己负责维护存储空间。ostrstream处理这个问 题的方法是"冻结"自己。用户通过str()函数返回指向输出流内容的字符数组的指针,并将自己"冻结"。用户不能再它添加字符,ostrstream对 象也不再负责存储空间的自动释放,必须由用户自己清理存储器:
   delete os.str();
   如果想添加更多的字符,一般的做法是新建一个ostrstream,将旧的流灌入新流中,并向新流添加字符。 如果使用自动分配存储空间的方法,则使用无参的构造函数:
   ostrstream os;
   这时对象os在堆中分配一块存储空间,并自己维护。当用户输入不断增加,原存储块不够用时,它可以再分配更多的存储空间。用户可以通过调用成员函数rdbuf()返回缓冲区指针,以访问缓冲区的内容。

ostrstream类支持一个字符数组作为数据传输目的地的输出流,它可以使用我们为它申请的存储空间,这时字节在内存中被格式化;也可以使用自动分配的存储空间。
   我们为ostrstream申请存储空间的方法是通过ostrstream有参的构造函数:
   ostrstream(char*, int, int=ios::out);
   当插入操作超过申请的存储空间的小时,流的bad标志会置位。
   如果使用自动分配存储空间的方法,则使用无参的构造函数:
   ostrstream os;
    当不知道数据需要多少空间时,这是一种很好的方法。这时对象os在堆中分配一块存储空间,并自己维护。当用户输入不断增加,原存储块不够用时,如果有必 要,它将移动存储块以分配更多的存储空间。用户可以通过调用成员函数rdbuf()返回缓冲区指针,以访问缓冲区的内容。但是有一个问题:当空间不够,流 对象自己移动存储块以分配更多空间时,原来的缓冲区指针已经失效,但是用户是不知道的,因为流对象自己负责维护存储空间。ostrstream处理这个问 题的方法是"冻结"自己。用户通过str()函数返回指向输出流内容的字符数组的指针,并将自己"冻结"。用户不能再它添加字符,ostrstream对 象也不再负责存储空间的自动释放,必须由用户自己清理存储器:
   delete os.str();
   如果想添加更多的字符,一般的做法是新建一个ostrstream,将旧的流灌入新流中,并向新流添加字符。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值