我的BUG日记
来源:互联网 发布:java意见反馈模块 编辑:程序博客网 时间:2024/04/30 03:15
记录职业生涯中遇到印象深刻的BUG:
1. win32网络编程中,发送和接受所用的缓冲区大小不同,导致recv函数必须调用多次才能接收完毕,详情见:
http://blog.csdn.net/qq_33826977/article/details/78191412
2.在一次关于装饰者模式的UI判断中,由于之前的结构体的某个成员变量没有初始化变成垃圾值,导致函数中判断的值永远为FALSE
3. 当创建了win32项目,却使用了console风格的类函数时,报一个 winmain 的链接错误
解决方法是在项目属性,C/C++中修改属性
4.有一次调用node.lib时,报错node.lib不完整,搞了很久之后, 发现用npm默认下载node.lib的网络连接有问题,总是没法下载到完整的lib文件
解决办法就是自己去官网下载,再替换掉。
5.打开一些vs项目时会因为vs版本不同而报错,比如说VS2013 对应的是 120
6.在使用一个日记类的时候,其逻辑是,新开一个线程专门讲sstringstream中的内容追加到文件中,主线程负责追加到内容到sstringstream中,通过event和锁的机制来保证读写一致:
int main() { FileLog filelog("log.txt");filelog.Start();//此时开始新线程std::ofstream ofs;//Sleep(2000);myBaseFilelog.AddString("kkkkkkkkkk");myBaseFilelog.AddString("88888lllllllzzzzzzzzzzzzzzzzzzzz5555");}
发现并没有意料中的结果。
问题的根源是: 主线程很快就退出了,而子线程可能还没开始运行——多线程的问题果然得考虑到先后机制啊!
目前比较挫的办法就是中间加个Sleep.
7. 使用std::wcout读取unicode文本并且输出到控制台时,发现一旦读取到 “©” 这个字符,后面的字符再也无法输出,代码如下:
std::wstring str = TEXT("我没想到");wcout.imbue(locale("", LC_CTYPE));wcout << str << std::endl;ifstream fin;fin.open(TEXT("C:\\Users\\admin\\Desktop\\test.ini"), ios::binary);// 跳过unicode文本开头有两个字节0xFFFE(称作BOM,用于标识unicode编码)fin.seekg(2, ios::beg);while (!fin.eof()){wchar_t wch, wch2 = TEXT('©');fin.read((char *)(&wch), 2);//cout << wch <<" "<< *((&wch) - 1)<<endl;if (wch != wch2){//cout << "don;t equal" << endl;wcout << wch;}else{//wcout << "equal ©" << endl;wcout << wch;}}通过
wcout.imbue(locale("", LC_ALL));wcout << wch;wcout.imbue(locale("", LC_CTYPE));可以改变,但是仍然无法输出“©”,而是输出了问号
8.读取unicode文本,到达EOF时老是会把读取末尾的字符2次
问题根源:在进行read操作时,即使读取了字符文件末尾,都是还没有到达EOF,所以eof判断为假,再读一次,到达了EOF,没有读到内容,所以存储变量仍然是之前的内容,那么就会得到2次的结果。所以最好的方法是操作之前判断它有没有读取成功。
while (!fin.eof()) //std::ifstream fin;{fin.read((char *)(&readChar), 2);if (fin.good()){//do something}else // fin.bad() , 避免EOF时读取到末尾字符2次的情况{//do something}}
9.读取文本时发现了不能稳定出现的BUG,可能会有中断,或者断言,或者crash,或者正常运行
问题根源: 不能稳定出现,往往和内存有关系,问题代码如下:
wchar_t* sDes = new wchar_t();std::wstring value = L"";int len;if (GetValue(iKey, sDes, len)){for (int i = 0; i < wcslen(sDes); i++) { value = value + *(sDes + i);}return value;}
GetValue函数对 *(sDes + i) [即传入指针的后续内存]进行了赋值操作。
因为我们传入的只是一个char类型指针,那么它内存后面的数据和空间都是未知的,也就是随机的。所有是一个不稳定的BUG。
所以尽量使用wchar_t sDes[100] = { 0 };
申请一片连续的内存,再传入首地址。
10. new和delete一定要成对出现,不要再犯内存泄漏的毛病!!!
11.在vs下遇到了LNK 2001错误,问题根源是: 在类的头文件中声明了静态成员变量,但是在实现文件中没有定义。
又或者是头文件有函数声明,但是实现文件没有写相应的函数定义。
12.在进行一个定时器的设置时,由于传入一个TimePoint , 比当前时间早,相比较为负数,又因为时间间隔参数声明为uint_64, 导致加上负数溢出变成了一个奇怪的数值
解决方法: 在相加之前将uint强转成int, 先比较一下是否会变成负数,再进行后续操作
- 我的BUG日记
- 日记-记录我的日记
- 疯狂的IE BUG日记
- 我的系统安全日记
- 我的日记
- 我的日记
- 我的学习日记!
- 我的情人节日记
- 我的日记
- 我的日记
- 我的工作日记
- 我的装修日记
- 我的晨间日记
- 我的日记2009
- 我的日记2008
- 我的小日记
- 写写我的日记
- 我的求职日记
- 高并发Java(3):Java内存模型和线程安全
- Loadrunner安装与破解
- 基数排序
- Java项目生成jar包
- 大数据入门——使用决策树模型预测泰坦尼克号乘客的生还情况
- 我的BUG日记
- 第五周项目 项目2
- 极乐技术周报(第三十期)
- PHP定义函数的几种方式
- mysql性能优化
- 第四周项目5
- linux配置tomcat以service方式启动
- 网络流(多样的建模)
- C++转型动作的新认识