我的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, 先比较一下是否会变成负数,再进行后续操作