2012-12-06 2 views
0

L'argument qui est transmis à class Rock est un vector<vector<unsigned int> >: bad_alloc en passant référence de vecteur de pointeur vers vecteur dans constructeur

population est défini comme:

const std::vector<std::vector<unsigned int> > * population; 

dans le constructeur:

Rock::Rock (const vector<vector<unsigned int> > & v): 
population (&v) 
{ 
cout << "constructor: population.size: " << population->size() << " population[0].size: " << (*population)[0].size() <\ 
    < endl; 
} 

qui imprime:

constructor: population.size: 500 population[0].size: 4 

Ensuite, dans la prochaine fonction membre qui est appelé après le constructeur:

population.size(): 500 population[0].size() 18446744073709533580 

Ce que je pensais est que population garderait une copie de l'adresse du vector qui est passé à Rock et qu'il garderait dans toutes les fonctions des membres de la classe. Mais il semble qu'il perd la trace de ses éléments de second ordre.

Quel est le problème avec cela? Comment puis-je corriger cela? Je voudrais ne pas avoir à modifier le type de variable population, sinon le code suivant doit être ajusté aussi.

Modifier 0: Le code complet du constructeur:

Rock::Rock (const vector<vector<unsigned int> > & v, const map<unsigned int, AttType>& m, string f) : 
    // Default values for Rock parameters.                      
    population (&v), 
    att_type (m), 
    initial_pos (75000), 
    population_size (500), 
    sample_size (200), 
    theta (0.2), 
    nr_clusters (4), 
    max_dif (500), 
    label_as ("neighbors"), 
    debug (false) 
{ 
    resetBestPair(); 
    worst_pair.p1 = __INT_MAX__; 
    worst_pair.p2 = __INT_MAX__; 
    worst_pair.goodness = __DBL_MIN__; 

    cfg_file = f; 
    parseConfig(); 
    cout << "constructor: population.size: " << population->size() << " population[0].size: " << (*population)[0].size() <\ 
< endl; 
} 
+5

On dirait que le vecteur «v» transmis a cessé d'exister. –

+3

Ne pas stocker l'adresse des paramètres de la fonction. Ne fais pas ça. –

+1

Montrez-nous comment vous créez un 'Rock'. –

Répondre

1

Qu'est-ce que vous avez codé est « bien » (si dangereux) si vous savez que le vector<vector<unsigned int> > passé dans le constructeur sera encore là pour la durée de vie de l'objet Rock. Je soupçonne que le vecteur que vous traversez disparaît à un moment donné après la construction de l'objet Rock. Donc, votre objet Rock a un pointeur qui pend vers ce qui est utilisé comme un vecteur, mais est maintenant quelque chose de complètement différent (la mémoire a probablement été réaffectée à quelque chose d'autre par ce point). Maintenant, le programme interprète tout ce qui est à cet endroit comme un vecteur quand ce n'est pas le cas, et vous y trouvez des déchets. Vous pouvez également obtenir un SEGV, tout est plutôt imprévisible. Le fait que le premier ordre rapporte toujours le même nombre d'éléments (500) suggère que sa mémoire n'a pas encore été réallouée, ou bien l'utilisateur de ces données réallouées n'a pas écrasé la partie des données de gestion du vecteur qui indique son courant Taille.