получить повреждение кучи при изменении порядка переменных членов - PullRequest
2 голосов
/ 24 января 2010

У меня довольно странная проблема. мой класс среди других следующие мемеры:

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), я получу

а) объект другого размера, размер отчетов 248 вместо 252 байт

и

б) здоровенные повреждения кучи

GLboolean определяется как unsigned char, но так как я вообще не использую оптимизацию (дважды проверил это) это должно быть заполнено до 4 байтов в любом случае. И, в конце концов, если он накладывается, он должен делать это в обоих местах ..

протестированные компиляторы: CLANG (c ++), GCC4.2 com.apple.compilers.llvmgcc42

Кто-нибудь знает, как отследить это?

Ответы [ 4 ]

2 голосов
/ 24 января 2010

Проблема здесь почти наверняка не в перечисленных вами членах, а в другом, возможно, int, указателе или bool, который неправильно инициализирован в конструкторе . Пожалуйста, опубликуйте более крупный пример, который не удался, и убедитесь, что вы инициализируете все члены, используя список инициализации конструктора.

2 голосов
/ 24 января 2010

Я очень сомневаюсь, что проблема в коде, который вы разместили. Вы должны показать нам остальную часть класса. Однако некоторые намеки:

а) может произойти из-за выравнивания (нет, это не должно делать это в обоих местах одинаково, читайте о выравнивании данных )

b) может произойти, если вы передадите указатель этой структуры на некоторые вызовы GL, которые ожидают какого-то упорядоченного выравнивания

1 голос
/ 24 января 2010

Если это в начале, он ДОЛЖЕН дополнить другие переменные в правильном выравнивании. Если он в конце, он не должен заполняться, и он может исчезнуть до уже заполненного размера. Там нет никакой тайны.

Повреждение кучи не имеет к этому никакого отношения, оно просто раскрывается из-за различий в распределении из-за нового размера, то есть случайного шанса.

1 голос
/ 24 января 2010

Если вы хотите выяснить, где происходит заполнение, вы можете использовать опцию -Wpadding в gcc или попробовать pahole, которую можно использовать для оптимизации размера конструкции: https://twiki.cern.ch/twiki/bin/view/Atlas/UsingPahole

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...