最近写的功能里,发现一个单元测试在 Debug 下可以通过,但是在 RelWithDebInfo 下却报错。错误发生在使用memcmp
比较两个内存地址处。抽象出来的代码如下
struct GID{
MyType m_type; // Member with alignment as 8
bool used; // bool has alignment of 1
};
GID gid1;
...
GID gid2 = gid1;
assert(memcmp(&gid1, &gid2, sizeof(GID)) == 0); // failed for RelWithDebInfo
后来经过排查,发现 Debug 时gid2.used
成员之后内存是干净的,padding 均为 0 ,但是在 RenWithDebInfo 下gid2.used
之后内存却有随机值,导致了memcmp
失败。经过搜索发现了 auto-generated copy constructor 是不会将 padding 置零。读了 memcmp 的文档后也发现已经有提示过了。真是学无止境。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.