Bonjour,

voila je suis entrain de creer un program (qui utilise la librarie OpenCV)
Cependant j'ai remarqué (en utilisant la commande top) que ma RAM augmente continuellement.

Donc je me suis dit que j'avais une fuite de memoire... donc je me suis dit que je devrait essayer valgrind pour trouver cette fuite de memoire.

Le problème c'est qu'il me donne uniquement des message d'erreurs sur des parties de code qui sont appelé uniquement a la fin du programme.

Donc voici mes questions: Est-ce normal qu'un programme utilise de plus en plus de RAM (il n'y a aucun printf dans mon programme, et je n'ai aucune variable qui croit tout le temps dans mon code)


Ma deuxième question viens d'une des lignes a corriger selon valgrind

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
==12219==  Address 0x5b6a5bc is 12 bytes inside a block of size 24 free'd
==12219==    at 0x40246EA: operator delete(void*) (vg_replace_malloc.c:342)
==12219==    by 0x40C2824: __gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<std::string const, X7sParam*> > >::deallocate(std::_Rb_tree_node<std::pair<std::string const, X7sParam*> >*, unsigned) (new_allocator.h:98)
==12219==    by 0x40C2859: std::_Rb_tree<std::string, std::pair<std::string const, X7sParam*>, std::_Select1st<std::pair<std::string const, X7sParam*> >, std::less<std::string>, std::allocator<std::pair<std::string const, X7sParam*> > >::_M_put_node(std::_Rb_tree_node<std::pair<std::string const, X7sParam*> >*) (stl_tree.h:361)
==12219==    by 0x40C28BA: std::_Rb_tree<std::string, std::pair<std::string const, X7sParam*>, std::_Select1st<std::pair<std::string const, X7sParam*> >, std::less<std::string>, std::allocator<std::pair<std::string const, X7sParam*> > >::_M_destroy_node(std::_Rb_tree_node<std::pair<std::string const, X7sParam*> >*) (stl_tree.h:391)
==12219==    by 0x40C51B5: std::_Rb_tree<std::string, std::pair<std::string const, X7sParam*>, std::_Select1st<std::pair<std::string const, X7sParam*> >, std::less<std::string>, std::allocator<std::pair<std::string const, X7sParam*> > >::erase(std::_Rb_tree_iterator<std::pair<std::string const, X7sParam*> >) (stl_tree.h:1319)
==12219==    by 0x40C51EF: std::map<std::string, X7sParam*, std::less<std::string>, std::allocator<std::pair<std::string const, X7sParam*> > >::erase(std::_Rb_tree_iterator<std::pair<std::string const, X7sParam*> >) (stl_map.h:523)
==12219==    by 0x40C0548: X7sParamList::~X7sParamList() (X7sXmlParam.cpp:219)
==12219==    by 0x40C06D4: X7sXmlParamList::~X7sXmlParamList() (X7sXmlParam.cpp:302)
==12219==    by 0x4046B5F: X7sFGDetectorImpl::Release() (X7sFGDetector.cpp:152)
==12219==    by 0x40448BB: X7sVidSurvPipelineFG::~X7sVidSurvPipelineFG() (X7sVSPipelineFG.cpp:111)
==12219==    by 0x8048CD3: main (VidSurvVideo.cpp:77)
==12219==

Je ne suis pas sur de comprendre mais j'ai l'impression que je ne libère pas bien la mémoire, pour ces lignes d'exécution:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
X7sParamList::~X7sParamList() {
	X7sParam *param;
	m_mapID.clear();
	m_it=m_mapName.begin();
	while(m_it != m_mapName.end()) {
		param = (*m_it).second;
		if(param) delete param;
		m_mapName.erase(m_it);
		m_it++;
	}
}

Avec comme definition pour la classe

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
class X7sParamList {
private:
	std::map<std::string,X7sParam*> m_mapName;
	std::map<std::string,X7sParam*>::iterator m_it;
}
Voila et merci encore