今天开发中偶遇一个问题,程序乱崩溃,偶尔崩在new对象里,偶尔崩在对象释放里,甚至访问局部int变量也崩过,gdb显示不出更多有用信息,最后才定位到内存重叠问题

原始代码比较复杂,简化后就是下面的模型

1
2
char arr[9];
memcpy(&arr[0], &arr[3], sizeof(char)*6);

本意是节省点内存,直接用arr指向的内存,显然这里拷贝时存在重叠部分。阅读文档才知道原来memcpy不支持内存重叠的拷贝,之前还不知道。(搜索关键词 memcpy overlap)

memcpy 内存重叠会引发未定义问题,这也就是程序乱崩的原因

解决方案是换成memmove即可,或者新申请块内存,拷贝至新内存再拷回去