终于有5条裤衩了,如果你们看我不是5个三角就当看花眼

5条裤衩,工作日每天换一条,周6,日不穿内库
说说公司常见的雷人代码,写这些代码的人上至自称5年以上工作经验,下至刚毕业的...
看看各位有没有碰到这种情况.
要找工作的大学生们注意,你们进入企业后,可能会碰到更雷的,做好心理准备.
1,认为sizeof(char*)==sizeof(char[])的
我修改过几个bug,是这样的
char *pchar = new char[100];
strncpy(pchar, psrc, sizeof(pchar) - 1);
pchar[sizeof(pchar) - 1] = 0; //还知道有这会事,我很感谢
我就不明白char *pchar = new char[100]这句都写100了,strncpy(pchar, psrc, sizeof(pchar) - 1)这里写99能累死?
最后导致拷贝的名字被缩短......
2,线程参数放在栈上的
int fun_begin_xxx_thread(.../*一些参数*/)
{
STRUCT_XXX obj_thread_arg;//一般obj_thread_arg中一般都会有指针成员,或者CString,std::string
//一些参数处理,和obj_thread_arg的初始化
CreateThread(0, 0, thread_fun, (void*)&obj_thread_arg, 0, &id);
return ret_value;
}
我曾经见过有人这么启动线程,然后程序崩溃,还问:"怎么会崩溃".我非常无语.......
thread_fun这个线程的寿命一般会比创造它的函数fun_begin_xxx_thread长的多,里面大多是循环执行的任务.thread_fun的线程参数是obj_thread_arg,这个结构被定义在了栈上.thread_fun线程在运行的时候fun_begin_xxx_thread函数反回,obj_thread_arg被析构,里面的CString,std::string类型析构,指针变无效,如果进入thread_fun线程没有及时保存,里面还象pobj_thread_arg->pointer这样使用必然出错.
3,滥用stl的
最常见的就是这种map<CString, STRUCT_XXX*>.定义没什么问题但是,最后用完不释放second.second是自己分配的,STRUCT_XXX指针只是指向这个对象,不能析构的.它和map<CString, void*>没有任何区别,就是帮你在编译的时候检查一下类型.
4,滥用mfc容器的
CStringList这个用的最多,释放的时候非常有趣,这个类本身相当于一个map<int, CString>.他自己就会析构所有的CString,我见过很多次有人不厌其烦的用个循环,一个一个Remove,最多一个RemoveAll就ok了.
..........
各位当笑话看吧