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