最近C++开发过程中遇到的一些坑

来源:互联网 发布:windows高级编程 编辑:程序博客网 时间:2024/05/18 15:25

1. 对齐引发的bug

最近在移植一个项目代码,发现编译后报字节长度和客户端定义的长度不对,但是代码是直接移植过来的为什么会不对:

struct Head{ uint32_t a; uint32_t b; uint32_t c; uint32_t d; uint32_t e; uint32_t f; uint32_t g; uint32_t h; uint64_t i; uint64_t j; char k[32]; uint32_t l;};

理论上sizeof(Head) = 84, 但是移植到新的项目却等于88,代码没有任何改动,原封不动地移植过来,一开始以为是编译选项的问题,后面才恍然大悟是字节对齐问题。
默认是用8字节对齐的,最后一个uint32_t l;刚好变单数了又补齐了4个字节进行对齐,唉,最基本的基础知识都忘了,解决方法强制使用1字节对齐:

#pragma pack(1)struct Head{ uint32_t a; uint32_t b; uint32_t c; uint32_t d; uint32_t e; uint32_t f; uint32_t g; uint32_t h; uint64_t i; uint64_t j; char k[32]; uint32_t l;};#pragma pack()

2. 诡异coredump点

开发的过程中,有时随便改动一个很小的点却引发各种莫名奇怪的coredump点,进过折腾发现是编译时没有make clean,比如

|-- include|   |-- include.h|-- comm|   |-- makefile|   |-- comm.cpp|   |-- comm.h|-- svr|   |-- makefile|   |-- svr.cpp|   |-- svr.h

comm.cppsvr.cpp都引入include.h文件,comm目录编译出.a静态库被svr引用,如果修改了include.h没有重新在comm目录make clean编译出新的静态库,只重新编译svr目录,那么就会引发coredump。

3. 引入libevent使用hiredis异步功能编译错误

我们都知道redis有发布订阅功能,对应c/c++引入这种功能,需要引入libevent库
编译hiredis 发布订阅libevent

   In file included from /data/test/test_redis_sub.cpp:7:0: /data/test/../dep/hiredis-master/adapters/libevent.h:39:18: error: field 'rev' has incomplete type     struct event rev, wev;                  ^ /data/test/../dep/hiredis-master/adapters/libevent.h:39:23: error: field 'wev' has incomplete type     struct event rev, wev;

4. 进程一启动cpu一直100%

进程一启动cpu一直100%,通过ptrace/gdb各种工具看进程都正常,最后看代码发现是一个异步日志初始化了两次,怀疑是内部加锁,还没时间深究?

0 0
原创粉丝点击