strstream 教训

用stringstream替换strstream!

 

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

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

    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,将旧的流灌入新流中,并向新流添加字符。

 

你可能感兴趣的:(C/C++)