c++开发中常见bug总结(不定期更新)

来源:互联网 发布:php简历真实 编辑:程序博客网 时间:2024/04/29 07:42

尽管平时千叮咛万嘱咐,可是低级错误总是不可避免的会在程序开发过程中出现:

因此博主记录自己开发过程中出现过的错误,以便后期参考和总结:

1. 通过指针加下标访问数组

我自己写的一段代码,通过结构体指针p_structA 逐个访问结构体数组A,A大小为3, 

指针初始化, p_structA = &A

循环中通过加循环索引值index(从0开始), p_structA = p_structA + index (问题便出在这!!!)

分析:我注意到问题的时候是因为每次取第三个结构体值时,总是取不到,可是原结构体的值已经存在了,因此肯定是访问的时候出了问题。

显然,第一次index的值为0,访问第一个结构体数组元素正确,p_structA 指向A的第一个元素

第二次index的值为1,访问第二个结构体数组元素正确,p_structA 指向A的第二个元素

第三次index的值为2,访问第三个结构体元素失败,p_structA指向未知区域,因为A只有三个元素!

解决办法是申明另外一个相同指针p_structA 2,每次赋值为p_structA + index ,而不是每次改变p_structA 


2. 字符数组长度太小,造成程序崩溃

这次是调试守护进程的时候,调试大半天了,一直不知道原因出在哪儿,有以下几个特征:

(1)它在执行完一个子函数之后本地日志便再无更新(进程因为异常退出了)

(2)之前偶然出现过一次异常现象:字符串输出时打印出了未知符号,


CTO大神过来看了,三五分钟检查到有一个字符数组长度设太小,导致字符串溢出异常,

太小的原因是,输出的字符串是路径信息,导致总的字符过多,并且使用了sprintf,而非snprintf,


3. strncpy字符块拷贝,拷贝结果不完全

这也算是字符操作的陷阱之一,在拷贝流媒体数据时,比如视频流、音频流等数据,因为不可避免的碰到大量的'\0'字符,

所以当使用strncpy进行字符块拷贝时,一旦遇到'\0'字符,便会结束拷贝,解决的办法便是选用memcpy,来执行拷贝。


4. linux环境下进行源程序的编译

(1)第一次编译后,可以成功运行。

(2)重新启动了下系统, 编译另外一个程序,执行时出现权限错误,查看文件属性,发现对当前用于没有可执行的权限

(3)用chmod a+x filename(当前目录)改变文件的可执行权限,再次执行,出现cannot execute binary file错误

(4)遂百度百度百度,找到了蛛丝马迹, 原来是编译的时候用错了格式,

正确的编译程序是 gcc sourcefile -o outputfile

我的错误格式:  gcc -c sourcefile -o outputfile


5. 文件保存(针对视频流裸流解析,hik(海康) ipc(网络摄像头))

这个错误是我自己给自己挖的一个巨坑,拖着CTO解决了近一个星期,把自己都快整抑郁了,

这是在调试网络摄像头网RTMP服务器推流时,为了排除取流时出错的可能性,用写文件的方式把从海康摄像头里面剥离的h264数据保存成本地文件,

这个bug就出在这里,因为视频数据写入文件必须用二进制的方式来写,这样获得的h264数据才能正常播放, 而我根本没注意到这个问题的严重性,选择了初学者最常用的字符方式写入文件,导致h264文件无法正常用vlc播放器查看,但最坑爹的是,播放器解析出来的各项参数都是正确的,唯独视频画面像瀑布一样



6. libevent使用bug

在使用evhttp_add_header以及evbuffer_add_printf时,出现http请求体出现重复,出现此bug的代码:

evbuffer_add_printf(req->output_buffer, header.c_str());    evhttp_add_header(req->output_headers, "Host", evhttp_uri_get_host(uri));


更正后的代码为:

evbuffer_add_printf(req->output_buffer, header.c_str());    std::string tmp = evhttp_uri_get_host(uri);    evhttp_add_header(req->output_headers, "Host", tmp.c_str());


7. 文件路径出现空格

这个bug我检查了两天左右,一直在其他问题上面走死胡同。我当时是为了做测试,

把路径信息包括文件名手工copy进去数据库中,应该是在copy过程中不知道怎么混进去一个空格!

给我这一顿思考!!!!


8. 析构函数指针释放错误

在一个析构函数里面,把条件设为 if(NULL == m_pHttpServer) Free(m_pHttpServer), 这个在执行到main函数结尾时报错,

libc-start.c: No such file or directory,然后用gdb一直单步调试(s),最后发现是这个语句错了,空指针还去释放,这不是没事找事么!

真想痛扁自己!


0 0