2010-01-24 6 views
2

J'ai un problème assez étrange. ma classe a -entre autres- memers suivantes:obtenir la corruption de tas lors de la modification des variables membres

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; 

si je mets le has_alpha à (location2) je reçois

a) différente taille de l'objet, sizeof rapporte 248 au lieu de 252 octets

et

b) corruptions tas lourdes

GLboolean est défini comme unsigned char, mais depuis que je l'utilise pas d'optimisation du tout (double cochée) cela devrait être rembourré à 4 octets de toute façon. Et à la fin, si elle Pads, il devrait le faire dans les deux endroits ..

compilateurs testés: Clang (C++), GCC4.2 com.apple.compilers.llvmgcc42

Toute une idée comment dépister cela?

+0

Aucun problème évident basé sur ce que vous avez posté. Nous aurions besoin de voir tous les membres pour voir pourquoi cela va de 252 à 248. –

+3

Avez-vous recompilé tous les objets qui utilisent votre classe? – ephemient

+0

@ ephemient - lol, n'a pas pensé à la solution la plus évidente: D –

Répondre

2

Le problème ici est très certainement pas dans les membres que vous avez énumérés, bu un autre, éventuellement un int, un pointeur ou boolqui n'est pas correctement initialisé dans le constructeur. Veuillez publier un exemple plus grand qui échoue et assurez-vous d'initialiser tous les membres à l'aide de la liste d'initialisation du constructeur.

+0

Le problème était en effet quelque part dans les classes de base dérivées – user257620

2

Je doute fortement que le problème soit dans le code que vous avez publié. Vous auriez besoin de nous montrer le reste de la classe. Cependant quelques conseils:

a) peut se produire en raison de l'alignement (non, il ne devrait pas le faire à deux endroits le même, lisez data alignment)

b) peut se produire si vous passez un pointeur de cette structure à certains appels GL qui attendent une sorte d'alignement ordonné

1

Si c'est au début, il faut ajouter les autres variables sur l'alignement de droite. Si c'est à la fin, il n'a pas besoin de pad et il pourrait être capable de disparaître dans la taille déjà matelassée. Aucun mystère là-bas.

La corruption de tas n'a rien à voir avec cela, elle est simplement exposée en ayant des allocations différentes dues à la nouvelle taille - c'est-à-dire au hasard.

+0

ce n'est pas à la fin, il y a des membres suivants de type long – user257620

Questions connexes