Moyen d’initialiser les structures C ++

Notre code implique une structure POD (Plain Old Datastructure) (c’est une structure c ++ de base qui contient d’autres variables structurelles et POD qui doivent être initialisées au début).

Basé sur ce que j’ai lu , il semble que:

myStruct = (MyStruct*)calloc(1, sizeof(MyStruct)); 

devrait initialiser toutes les valeurs à zéro, comme le fait:

 myStruct = new MyStruct(); 

Cependant, lorsque la structure est initialisée de la seconde manière, Valgrind se plaint plus tard que “le saut ou le déplacement conditionnel dépend de la ou des valeurs non initialisées” lorsque ces variables sont utilisées. Est-ce que ma compréhension est imparfaite ou est-ce que Valgrind jette de faux positifs?

En C ++, les classes / structures sont identiques (en termes d’initialisation).

Une structure non POD peut aussi avoir un constructeur pour pouvoir initialiser les membres.
Si votre struct est un POD, vous pouvez utiliser un initialiseur.

 struct C { int x; int y; }; C c = {0}; // Zero initialize POD 

Sinon, vous pouvez utiliser le constructeur par défaut.

 C c = C(); // Zero initialize using default constructor C* c = new C(); // Zero initialize a dynamically allocated object. // Note the difference between the above and the initialize version of the constructor. // Note: All above comments apply to POD structures. C c; // members are random C* c = new C; // members are random (more officially undefined). 

Je crois que Valgrind se plaint parce que c’était comme ça que C ++ fonctionnait. (Je ne sais pas exactement quand C ++ a été mis à niveau avec la construction par défaut de l’initialisation). Votre meilleur pari est d’append un constructeur qui initialise l’object (les constructs sont des constructeurs autorisés).

En guise de note:
Beaucoup de débutants essayent de valoriser init:

 C c(); // Unfortunately this is not a variable declaration. // The correct way to do this is: C c = C(); 

Une recherche rapide de la «parure la plus agitée» fournira une meilleure explication que moi.

D’après ce que vous nous avez dit, cela semble être un faux positif dans valgrind. La new syntaxe avec () devrait initialiser l’object, en supposant que ce soit POD.

Est-il possible qu’une sous-partie de votre structure ne soit pas en réalité un POD et que cela empêche l’initialisation attendue? Êtes-vous en mesure de simplifier votre code dans un exemple postable qui signale toujours l’erreur valgrind?

Peut-être que votre compilateur n’initialise pas réellement les structures POD.

Dans tous les cas, la solution la plus simple est probablement d’écrire le (s) constructeur (s) selon les besoins de la structure / des sous-parties.

Vous devez initialiser les membres de votre structure, par exemple:

 struct MyStruct { private: int someInt_; float someFloat_; public: MyStruct(): someInt_(0), someFloat_(1.0) {} // Initializer list will set appropriate values }; 

J’écris un code de test:

 #include  #include  #include  using namespace std; struct sc { int x; ssortingng y; int* z; }; int main(int argc, char** argv) { int* r = new int[128]; for(int i = 0; i < 128; i++ ) { r[i] = i+32; } cout << r[100] << endl; delete r; sc* a = new sc; sc* aa = new sc[2]; sc* b = new sc(); sc* ba = new sc[2](); cout << "az:" << a->z << endl; cout << "bz:" << b->z << endl; cout << "a:" << a->x << " y" << a->y << "end" << endl; cout << "b:" << b->x << " y" << b->y << "end" <x << " y" << aa->y << "end" <x << " y" << ba->y << "end" < 

g ++ comstack et exécute:

 ./a.out 132 az:0x2b0000002a bz:0 a:854191480 yend b:0 yend aa:854190968 yend ba:0 yend 

Comme il s’agit d’une structure POD, vous pouvez toujours la réduire à 0 – cela pourrait être le moyen le plus simple d’obtenir les champs initialisés (en supposant que cela soit approprié).