list<Image>::iterator i = m_t_image.end();
i--;
C'est moche ça !! Je te déconseille fortement d'utiliser ce genre de choses, std::list a une fonction qui s'appelle back() et qui fait ce que tu veux (récupérer le dernier élément).
De plus, as-tu vérifié que le constructeur par copie de la classe Image, ainsi que l'opérateur d'assignation de cette classe sont définis correctement ? S'ils ne le sont pas je te conseille de stocker dans m_t_image des pointeurs sur Image (sinon le comportement est indéfini).
En tout cas, le fait de récupérer un pointeur sur un élément d'une liste n'est pas une chose à faire, car la STL fait tout un bordel avec les éléments que tu donnes à ses conteneurs (c'est d'ailleurs pour cela que le constructeur par copie et l'opérateur d'assignation de ces éléments doivent être définis correctement). Donner un iterateur (à ton constructeur de Image_id_index) sur l'élément ne serait pas non plus une solution car les itérateurs sont modifiés à la moindre modification du contenu de la list.
Donc, tout ça pour dire que dans m_t_image tu devrais stocker des pointeurs sur Image (nus ou managés, ça importe peu, si tant est que tu désalloues bien les pointeurs nus).
Pour moi les problèmes que tu rencontres viennent donc certainement de :
et
m_t_image_id_index.push_back(Image_id_index(&(*i),index,id));
que je réécrirais ainsi :
et
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
|
// Ajout d'un constructeur par copie et d'un operateur d'assignation pour Image_id_index
Image_id_index::Image_id_index( const Image_id_index & p_image)
: m_img( p_image.m_img)
, m_index( p_image.m_index)
, m_name( p_image.m_name)
{
}
Image_id_index & Image_id_index::operator =( const Image_id_index & p_image)
{
m_img = p_image.m_img;
m_index = p_image.m_index;
m_name = p_image.m_name;
}
bool Image_pack::push_back( const string & img_path, int index, const string & id)
{
Image * pImg = new Image;
if( ! pImg->LoadFromFile(img_path.c_str()))
{
cout<<"Le fichier ressource est corrompu ou l'image n'existe pas"<<endl;
delete pImg;
return false;
}
m_t_image.push_back( pImg);
m_t_image_id_index.push_back( Image_id_index(pImg,index,id));
return true;
}
//Ajout d'une fonction cleanup permettant de supprimer tout le bordel
void Image_pack::cleanup()
{
for (list<Image>::iterator it = m_t_image.begin() ; it != m_t_image.end() ; ++it)
{
delete ( * it);
}
m_t_image.clear();
m_t_image_id_index.clear();
} |
Partager