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

尽管平时千叮咛万嘱咐,可是低级错误总是不可避免的会在程序开发过程中出现:因此博主记录自己开发过程中出现过的错误,以便后期参考和总结:

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

我自己写的一段代码,通过指针访问数组内容:

type struct T{
   int score;
};

T A[3];

T *p = &A;

循环中通过加循环索引值 index(从0开始), p = p + index ;但每次取第三个结构体值时,总是取不到,

确认数组的值是存在的,因此肯定是访问的时候出了问题。

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

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

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

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

 

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());

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值