boborde | Voila mon problème, ca fait maintenant un moment que je suis sur ce problème d'allocation mémoire, et le commence sérieusement à être a cours d'idée.
je travaille dans mes classes avec des liste de string déclrées comme suit
Code :
- #include <string>
- #include <list>
- #include <fstream>
- using namespace std;
- typedef list<string> liste_string;
|
Ainsi je peux allègrement passer mes données texte à mes différents objets sans problèmes.
Je suis récemment passé à la version 6 de builder. Je suis incapable de dire cet élément ( le passage à la STL port ) est à prendre a compte pour le problème suivant :
une erreur d'exception ( Voilation d'accès ... à l'adresse .... )
lors d'un push_back dans une liste de string :
Code :
- for ( liste_string::iterator itDim = (Temp.begin()) ;
- ( (itDim != Temp.end()) && ( !FinParcours ) );
- itDim ++ )
- {
- // détection de la barre de séparation
- if ( !strcmp( ( itDim->substr( 1,itDim->length()-1 )).c_str() ,
- ( string( itDim->length(),'-') ).c_str() ) )
- FinParcours = true ;
- // si la ligne est valide et contient au minimum 13 caractères
- if ( (!FinParcours) && (itDim->length() > 13) )
- {
- // conversion des dimensions de la fiche vers le même format que celui
- // indiqué sur CompilLig afin de pouvoir les comparer
- // les dimensions converties sont placées dans un string formaté sous 9c
- // dont le premier renseignera sur sa non disponibilité dans la fiche
- str = " " ;
- tmp = ConvertirDimension( itDim->substr(1,6) );
- str += RetournerEspace( 4,tmp.length() );
- str += tmp ;
- tmp = ConvertirDimension( itDim->substr(7,6) );
- str += RetournerEspace( 4, tmp.length() );
- str += tmp ;
- // Insertion dans la liste
- [color=red]DimFiche.push_back(str);[/color]
- }
- }
|
le code ci dessus se charge juste de vérifier la présence d'éventuels doublons et de gérér l'ajout d'une nouvelle entrée à la liste en remplaçant la 1° lettre du nouveauy string par une astérique
la pile d'appel donne les informations suivantes :
Code :
- 77F863BA ntdll.dll
- 004031B3 _STL::__node_alloc<1, 0>::allocate(__n=14)
- 00402791 _STL::allocator<char>::allocate(this=:008C7E04, __n=14, =NULL)
- 004041B5 _STL::_String_base<char, _STL::allocator<char> >::_M_allocate_block(this=:008C7DFC, __n=14)
- 00403450 _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >::_M_range_initialize<char *>(this=:008C7DFC, __f=:00922CF4, __l=:00922D01, =:0012F134)
- 00402DCC _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >::_M_range_initialize<char * const>(this=:008C7DFC, __f=:00922CF4, __l=:00922D01)
- 00402D9F _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >(this=:008C7DFC, __s=:0012F38C)
- 00403FED _STL::_Construct<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> > >(__p=:008C7DFC, __value=:0012F38C)
- 00403EFA _STL::list<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::allocator<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> > > >::_M_create_node(this=:0012F3C4, __x=:0012F38C)
- 00403A09 _STL::list<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::allocator<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> > > >::insert(this=:0012F3C4, __position={ :008C6020 }, __x=:0012F38C)
- 004064CA _STL::list<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> >, _STL::allocator<_STL::basic_string<char, _STL::char_traits<char>, _STL::allocator<char> > > >::push_back(this=:0012F3C4, __x=:0012F38C)
- 0041A298 GestionRequis::EnumererDimensions(this=:008AEF64, ContenuFicheArt={ { :008C72C0 } }, CodeArticle={ "L05M300CB", "", { " -" } })
- 00415F0C GestionRequis::TraiterFicheContenuQuantitatif(this=:008AEF64, ContenuFiche={ { :008C72E0 } }, TypeArticle={ "A", "", { "?" } }, CodeArticle={ "L05M300CB", "", { "3002" } })
- 00419761 GestionRequis::TraiterFiche(this=:008AEF64, CodeArticle={ "L05M300CB", "", { "" } })
- 0041A847 GestionRequis::Requisitions(this=:008AEF64)
- 00401AAB main(argc=1, argv=:008A542C)
|
je précise avoir essaye de changer ce morecau de code d'emplacement , de méthode.
les string contiennent bien des valeurs et la liste et bien initialisée.
La méthode ne plante pas à sa première execution....
le debugger pointe la méthode allocate du fichier _alloc.h
Code :
- static void * _STLP_CALL allocate(size_t __n) { return (__n > (size_t)_MAX_BYTES) ? __stl_new(__n) : _M_allocate(__n); }
|
je ne pense pas qu'il soit terriblement utile d'essayer de refaire ce code
puisque des parcours de liste de string en ce genre sont déja en place dans mon programme en divers endroit et fonctionnement parfaitement.
Merci pour vos suggestion. |