2009-09-07 14 views
1

J'ai une classe A comme suit:C++ initialisation classe tableau instance

class A 
{ 
public:  
    A() 
    {   
     printf("A constructed\n");   
    } 
    ~A(); 
    //no other constructors/assignment operators  
} 

Je les suivantes ailleurs

A * _a; 

J'initialiser avec:

int count = ... 
... 
_a = new A[count]; 

et je avoir accès avec

int key = .... 
... 
A *a_inst = &(_a[key]); 
.... 

Il s'exécute normalement, et le printf dans le constructeur est exécuté, et tous les champs dans A sont bien.

j'ai couru Valgrind avec les args suivants:

valgrind --leak-check=full --show-reachable=yes --track-origins=yes -v ./A_app 

et Valgrind ne cesse de crier à propos

Conditional jump or move depends on uninitialised value(s) 

puis la trace de la pile aux états de accesseurs.

Quelqu'un peut-il expliquer pourquoi cela se produit? Spécifiquement si ce que Valgrind dit est vrai, pourquoi le constructeur est-il exécuté?

+0

Spécifiquement quelle ligne est signalée par valgrind, et quelle ligne est-elle l'origine de la valeur non initialisée? – mark4o

+0

La valeur non initialisée a été créée par une allocation de tas. Et il pointe vers la ligne qui a été ajoutée au tableau. – jameszhao00

+0

Et quelle ligne a été marquée comme dépendant de la valeur non initialisée? – mark4o

Répondre

3

Cela peut signifier que key ou count contient une valeur non initialisée. Même si vous l'initialisez dans la déclaration, par ex. int key = foo + bar;, il se peut que foo ou bar ne soit pas initialisé et que valgrind l'applique à key.

+0

Merci pour ce conseil. Pendant que je vérifie le code, y a-t-il une option valgrind qui montre ces détails? – jameszhao00

+0

Puisque vous utilisez --track-origins = yes, il devrait vous indiquer l'origine de la valeur non initialisée dans le message suivant. – mark4o

+0

Il dit que le tableau n'est pas initialisé. – jameszhao00

2

Edit: Essayez de régler A *a = 0;

Exécution de votre code dans un scénario simplifié ne produit pas d'avertissement de Valgrind. Considérez le code suivant:

#include <iostream> 

class A 
{ 
    public: 
     A() 
     {  
      std::cout << "A" << std::endl; 
     }  
}; 

int main() 
{ 
    A *a; 
    int count = 10; 
    a = new A[count]; 

    int key = 1; 
    A *inst = &(a[key]); 

    return 0; 
} 

Compilé avec:

$ g++ -g main.cc -o main 

et courir avec:

$ valgrind --leak-check=full --show-reachable=yes --track-origins=yes ./main 

Donc, je pense que plus d'information est nécessaire. Vous faites probablement quelque chose entre la définition de _a et l'allocation réelle de la mémoire sur le tas. Pourrais-je simplement suggérer que vous fusionniez la définition et l'allocation en une seule ligne?

int count = 10; 
    A *a = new A[count]; 
+0

Vous devez --leak-check = full --show-reachable = oui --track-origines = oui -v – jameszhao00

+0

Toujours pas d'avertissement sur mon système :) – carl

+0

Hmm bizarre ... mais les choses que j'ai ci-dessus est la bonne initialisation droite? – jameszhao00

Questions connexes