- 1.最近在处理输入流的时候,由于输入流失败后导致了无限循环。在VS2017环境下考虑使用cin.sync()清空输入流后依旧无效。简化的大致程序如下:
int main() {
int a;
while (true) {
cin >> a;
if (cin.rdstate()) {
cout << "input bit state:" << cin.rdstate() << endl;
cout << "输入为非int 请重新输入!" << endl;
cin.clear();
cin.sync();
//cin.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
else {
cout << "input bit state:" << cin.rdstate() << endl;
cout << a << endl;
}
}
查阅后,知道不同编译器对cin.sync()具体实现不同,可能VS2017的实现并不是销毁输入缓冲区,使用cin.ignore()成功清空输入流。
参考见:
https://zh.cppreference.com/w/cpp/io/ios_base/sync_with_stdio
https://blog.youkuaiyun.com/imkelt/article/details/52202002
https://www.cnblogs.com/seamusopen/p/8451883.html
- 2.关于最近实现单例模式的一些记录和思考:
简单的线程安全的懒汉单例模式实现:
class Test {
public:
static Test* get_instance() {
SomeLock();
static Test testInstance;
return &testInstance;
SomeUnlock();
}
private:
Test() {}
~Test(){}
};
int main() {
auto pt=Test::get_instance();
//...
}
简单的饿汉单例模式实现,饿汉单例模式本身就是线程安全的:
class Test {
public:
static Test* get_instance() {
return &testInstance;
}
private:
Test() {}
~Test() {}
private:
static Test testInstance;
};
Test Test::testInstance;
int main() {
auto pt=Test::get_instance();
//...
}
1) 因为testInstance
是静态变量,存储在静态区,因此保证了该对象的唯一性,而不会被实例化多次。
2) 当析构函数声明为private
时,无法在栈上实例化对象,因此只能考虑通过在类的内部使用静态方式构造,或者new
在堆内存中,再使用一个成员函数来释放资源如delete this;
。
3) 但单例模式不需要手动去释放资源(即调用析构函数)。因为它只实例化一个对象,不会在运行期产生内存泄漏。程序结束时,操作系统会自动释放进程占有的全部资源,包括内存资源。
- 3.shared_ptr<T>管理数组时,需要为数组提供一个专用的删除器,如:
shared_ptr<uint8_t> spData=make_shared<uint8_t>(new uint8_t[dataLen],[](uint8_t* p){delete[] p;});
-
4.Boost库单独使用ASIO模块时,可以使用asio下"config.hpp"中的一些宏,如ASIO_STANDALONE、ASIO_HAS_STDARR等宏,来避免使用boost的一些基础组件,导致程序体积过大。
-
5.结构体中的 char xx[0]是不占字节的,如sizeof(TestPack)==4:
#pragma pack(1)
typedef struct tagTestPack {
int num;
char data[0];
} TestPack;
#pragma pack()
记得#pragma pack(1)后还原为原来的对齐方式,同时可以使用#pragma pack(push,x)/#pragma pack(pop)。
- 6.尽量避免依赖操作系统的文件API,在C++17中有文件系统filesystem库。同时可以如下获取文件内容文件长度:
ifstream ifs("file_path", ios::binary);
if (!ifs) {
cout << "Could not open file!" << endl;
}
//获得长度
ifs.seekg(0, ios::end);//指针移动到文件末尾
streampos pos = ifs.tellg();//返回指针到文件头的距离 即文件大小
int fileLen = pos;
cout << "File size: " << fileLen << endl;
ifs.seekg(0);//返回文件头
//ifs.seekg(0,ios::beg);//返回文件头
char* srcData = new char[fileLen]();
ifs.read(srcData,fileLen);