Tant de choses intéressantes à considérer :
vector<AttrValue>* QueryEvaluator::getCandidateList(...) {
...
values.clear();
values.push_back(2);
values.push_back(3);
cout << "values is of size " << values.size() << endl;
return &values;
}
On dirait que tu as laissé de côté la partie la plus intéressante du code. ... ci-dessus. La morale de l'histoire est que vous devez fournir un code compilable qui montre l'erreur. Si vous réduisez votre problème à un petit exemple, vous le trouverez vous-même. Au minimum, vous devriez fournir les définitions exactes de tous les objets utilisés (le type est la chose la plus importante en C++).
Déclare-t-il le vecteur comme un objet local ?
std::vector<int> values;
Dans ce cas, la durée de vie des vecteurs est liée à la fonction et elle est détruite à la fin de la fonction. Cela signifie que son utilisation après le retour de la fonction est un comportement non défini (tout peut arriver).
Mais il semble également que vous utilisiez des objets dans le cadre de vos tests unitaires. Une solution potentielle est donc de faire en sorte que le vecteur fasse partie de l'objet. Le vecteur vivra alors aussi longtemps que l'objet (et pas seulement l'appel de la fonction) et le fait de renvoyer un pointeur vers lui fonctionnera comme prévu.
class QueryEvaluator
{
std::vector<int> values;
public:
vector<AttrValue>* QueryEvaluator::getCandidateList(...);
};
Une alternative serait de retourner le vecteur par valeur plutôt que par un pointeur. Cela signifie que l'objet sera correctement copié hors de la fonction et que le code appelant pourra manipuler et tester le vecteur autant qu'il le souhaite.
vector<AttrValue> QueryEvaluator::getCandidateList(...)
{
...
return &values;
}
Note complémentaire :
Vous devez également essayer de ne pas utiliser de pointeurs dans votre code. Les pointeurs ne transmettent aucune propriété, ce qui signifie que nous ne savons pas qui est responsable de la suppression de l'objet. Dans ce cas, une référence aurait probablement été mieux (vous ne retournez jamais NULL) car cela donne à l'appelant l'accès à l'objet tout en conservant la propriété (en supposant que vous avez décidé de ne pas retourner par valeur).