更改成员变量顺序时获取堆损坏

时间:2010-01-24 00:16:58

标签: c++ gcc

我有一个很奇怪的问题。我的班级 - 其他人 - 跟随memers:

GLboolean has_alpha; 
GLuint width;
GLuint height;
GLuint length;
GLuint millisPerFrame;
GLfloat uv[2];
GLuint texsize[2];
GLint compsize;
    // location2 
long preload_interval_next;
long preload_interval;

如果我把has_alpha放在(location2)我得到

a)不同的对象大小,sizeof报告248而不是252字节

b)沉重的堆损坏

GLboolean定义为unsigned char,但因为我根本没有使用NO优化 (仔细检查了这个)这应该填充到4个字节。 最后,如果它填充,它应该在两个位置都这样做。

编译器测试:CLANG(c ++),GCC4.2 com.apple.compilers.llvmgcc42

任何人都知道如何追踪这个?

4 个答案:

答案 0 :(得分:2)

我非常怀疑问题出在您发布的代码中。你需要向我们展示课程的其余部分。但有些提示:

a)可能由于对齐而发生(不,它不应该在两个地方都这样做,请阅读data alignment

b)如果将此结构的指针传递给某些期望某种有序对齐的GL调用,则可能会发生

答案 1 :(得分:2)

此处的问题几乎肯定不在您列出的成员中,而是另一个,可能是int,指针或bool 未在构造函数中正确初始化。请发布一个更大的失败示例,并确保使用构造函数初始化列表初始化所有成员。

答案 2 :(得分:1)

如果你想找出填充的位置,你可以使用gcc的-Wpadding选项,或试用pahole,它可以用来优化结构大小:https://twiki.cern.ch/twiki/bin/view/Atlas/UsingPahole

答案 3 :(得分:1)

如果它在开始时它必须填充以使其他变量在右对齐上。如果它在最后它没有垫,它可能会消失到已经填充的大小。那里没有神秘感。

堆腐败与此无关,它只是由于新的大小而具有不同的分配而暴露 - 即随机机会。