1.
c++单例模式为什么不在析构函数中释放静态的单例对象,而要加一个内嵌类
你自己试试,析构函数里delete单例对象跟delete this有什么区别?
你知道delete不仅仅是释放内存,还要先调用要释放对象的析构函数吗?
所以析构函数里delete自己,那不是就会造成析构函数无限递归下去吗?
而你写进去发现,根本没有死递归的话,建议你放句输出在析构函数里试试,看看这个单例析构函数有没有被执行?
这就是为什么要内嵌一个类来进行安全析构单例对象的原因。
你知道delete不仅仅是释放内存,还要先调用要释放对象的析构函数吗?
所以析构函数里delete自己,那不是就会造成析构函数无限递归下去吗?
而你写进去发现,根本没有死递归的话,建议你放句输出在析构函数里试试,看看这个单例析构函数有没有被执行?
这就是为什么要内嵌一个类来进行安全析构单例对象的原因。
2.stringstream对象(<sstream>)
如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法;
在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。
stringstream 主要是用在將一個字串分割,可以先用 clear( )以及 str( ) 將指定字串設定成一开始的內容,再用 >> 把个別的资料输出。
stringstream通常是用来做数据转换的。
stringstream不会主动释放内存(或许是为了提高效率),但如果你要在程序中用同一个流,反复读写大量的数据,将会造成大量的内存消 耗,因些这时候,需要适时地清除一下缓冲 (用 stream.str("") )
stringstream 提供的转换和/或格式化
stringstream 对象的一个常见用法是,需要在多种数据类型之间实现自动格式化时使用该类类型。例如,有一个数值型数据集合,要获取它们的 string 表示形式,或反之。sstream 输入和输出操作可自动地把算术类型转化为相应的 string 表示形式,反过来也可以。
3.cin\cout\cerr重定向文件:
#include <iostream>
#include<fstream>
#include<streambuf>
int main(int argc, char** argv) {
using namespace std;
ofstream fout("t.txt");
streambuf* old=cerr.rdbuf(fout.rdbuf());
cerr<<"there is something error"<<endl<<"c++ error"<<endl;
cout<<"hello error"<<endl;
cerr.rdbuf(old);
fout.close();
return 0;
}
将cerr错误输出重定向文件,同理也可以对cout,cin进行重定向。