zoukankan      html  css  js  c++  java
  • memcpy和memmove

      之前并不知道memmove,只知道memcpy。想当然的以为如果想将一个数组后面的内容移动在数组的前面,用memcpy就可以了。

      由于做的是新项目,又是我一个人开发,终于得到在实际项目上用c++11的机会了。今天将项目转到新环境,解决一些编译问题后正常启动进程。满心的欢喜的以为可以了。结果在查看日志的时候发现收到的网络包一直在报错,总是表示接收的消息头有问题。开始以为是我的逻辑有问题。函数很简单,就是接收网络消息,根据头判断整个消息包的大小,如果接收到消息包大于想要的消息包,就说明有多个请求同时到了。只要将请求一个一个分开来处理就好了。

      我的实现方式是将所收到的消息都放在一个成员变量的数组里,如果处理一个消息之后发现还有多的内容,就将数组后面多的内容覆盖到数组前面来,使用的函数是memcpy。

      第一步是打断点调试,由于没有定位到具体的错误,所以打的断点也不对,总是找不到错误在哪。第二步是加日志,发现只有当多个请求同时收到时才有可能会出现这个报错。仔细查看逻辑确认没有错误,终于将目光放在了memcpy上,搜索了一下,发现memcpy在源、目地址有重叠的时候不保证源地址的重叠区域在拷贝之前不被覆盖!这个时候应该用memmove!悄然大悟!改成memmove后顺利解决bug!

      这个小bug浪费的时间还不少,主要还是bug定位不准,完全没有考虑到memcpy会有问题。有句话说得好,当你排除一切不可能的情况,剩下的,不管多难以置信,那都是事实。

  • 相关阅读:
    gin内置验证器使用
    model
    work,工作模式
    orm框架
    simple模式下rabbitmq的代码
    rabbitmq介绍
    订阅模式
    路由模式
    redis五大数据类型
    Go操作redis
  • 原文地址:https://www.cnblogs.com/RookieSuperman/p/11306477.html
Copyright © 2011-2022 走看看