memcpy和memmove
Posted rookiesuperman
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了memcpy和memmove相关的知识,希望对你有一定的参考价值。
之前并不知道memmove,只知道memcpy。想当然的以为如果想将一个数组后面的内容移动在数组的前面,用memcpy就可以了。
由于做的是新项目,又是我一个人开发,终于得到在实际项目上用c++11的机会了。今天将项目转到新环境,解决一些编译问题后正常启动进程。满心的欢喜的以为可以了。结果在查看日志的时候发现收到的网络包一直在报错,总是表示接收的消息头有问题。开始以为是我的逻辑有问题。函数很简单,就是接收网络消息,根据头判断整个消息包的大小,如果接收到消息包大于想要的消息包,就说明有多个请求同时到了。只要将请求一个一个分开来处理就好了。
我的实现方式是将所收到的消息都放在一个成员变量的数组里,如果处理一个消息之后发现还有多的内容,就将数组后面多的内容覆盖到数组前面来,使用的函数是memcpy。
第一步是打断点调试,由于没有定位到具体的错误,所以打的断点也不对,总是找不到错误在哪。第二步是加日志,发现只有当多个请求同时收到时才有可能会出现这个报错。仔细查看逻辑确认没有错误,终于将目光放在了memcpy上,搜索了一下,发现memcpy在源、目地址有重叠的时候不保证源地址的重叠区域在拷贝之前不被覆盖!这个时候应该用memmove!悄然大悟!改成memmove后顺利解决bug!
这个小bug浪费的时间还不少,主要还是bug定位不准,完全没有考虑到memcpy会有问题。有句话说得好,当你排除一切不可能的情况,剩下的,不管多难以置信,那都是事实。
以上是关于memcpy和memmove的主要内容,如果未能解决你的问题,请参考以下文章