Daily Record

本文主要整理日常遇到的问题


2018.03.27

  1. 结构体初始化后需要进行清空
    1
    2
    struct mg_send_mqtt_handshake_opts opts;
    memset(&opts, 0, sizeof(opts));

2018.03.28

  1. 宏定义与函数名冲突,若宏定义在函数名的声明或定义之前,则会进行字符串替换,导致编译会报错
  2. MQTT QOS 学习
    1
    2
    3
    4
    5
    qos 0: 最多分发一次,消息可能送达一次也可能根本没送达,取决于底层的网络能力,接收者不会响应,发送者不会重发

    qos 1: 至少分发一次,服务质量确保消息至少送达一次,需要PUBACK报文确认

    qos 2: 仅分发一次,最高等级的服务质量,消息丢失和重复都是不可接受的

2018.05.29

  1. 布尔值变量的命名尽量使用如下规则:is_xxx
  2. lua字符串拼接操作:若存在大量的字符串拼接操作,如循环等,不要使用..,因为每次都会申请临时内存,新建一个新的字符串,会导致内存来不及回收,可以使用table.insert + table.contact
  3. sscanf可以进行字符串分割和字符串数字转数字等,很强大!!!

2018.07.19

  1. 两个库有相同的符号,同时链接的话,运行时可能串库调用

2018.08.17

  1. 越界访问内存导致free失败的原因

molloc一块内存,在free的时候只需要传递指针首地址操作系统(或者说C语言)就可以对内存进行释放,那么它是怎么知道应该释放多大的内存呢?
其实C语言是维护了一个数据结构类似如下的结构,这个结构中主要有两个数据:一个是当前内存块的大小,另外一个是指向下一个空闲内存块:

1
2
3
4
typedef struct Header {
union header *ptr; /*next block if on free list*/
unsigned size; /*size of this block*/
} header;

其实我们在molloc(10)一块内存的时候,真正申请的不止是10个字节大小的内存,而是要加上一个struct Header结构体的大小,molloc返回给我们的内存想当于是p+sizeof(Header)的指针,而在free的时候,则C语言只需要将p-sizeof(Header)就能找到header结构,从而知道内存块大小。

2018.10.16

  1. 使用valgrind对可执行程序做内存检查,发现会存在still reachable的问题,可排除编码的问题。
    1
    valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --track-origins=yes a.out

查阅资料发现,许多C++库都实现了自己的内存分配管理器,在内存释放时不是将其直接还给系统,而是留在内存池中供下次使用,这导致程序退出时会被检测到still reachable。将使用C++库的地方去除再次验证,无该错误。
参考:https://stackoverflow.com/questions/30376601/valgrind-memory-still-reachable-with-trivial-program-using-iostream

About me

forthebadge

Creative Commons License This work is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。