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;
}
On dirait que le vecteur «v» transmis a cessé d'exister. –
Ne pas stocker l'adresse des paramètres de la fonction. Ne fais pas ça. –
Montrez-nous comment vous créez un 'Rock'. –