dbgheap.c erreur assert

dbgheap.c erreur assert - C++ - Programmation

Marsh Posté le 16-04-2005 à 20:52:57    

Bj tout le monde,
 
je vais essayer d'être clair mais ce n'est pas evident pour moi.
 
Voilà:
 
je travaille sous xp et VS C++ 6.
 
j'ai 1 appli qui ressemble à l'explorateur de Windows(fonctionalité basic...) .
 
AppWizard m'a enfait généré une SDI avec 1 CLeftView (CTreeView) et 1 CRightView(CListView).
Pour le moment la LeftView affiche tous les disk et rep de mon Pc et RightView affiche les Rep et Fich.. correspondants à l'élément sélectionné ds la TreeView.
 
Ensuite j'ai une CToolBar comme barre d'adresse qui contient une CComboBoxEx. Celle-ci étant synchronisée avec la TreeView comme dans Explorateur Win.  
 
Comme je souhaite implementer le Drag&Dropp sur ma treeView, je crée dans ma LeftView une Variable COleDropTarget m_dropTarget pour ensuite lancer m_dropTarget.Register(this); dans le OnCreate et c'est là ou mon problème commence.
 
j'ai le message d'erreur suivant dés le 1er affichage de ma fenêtre
 

Debug Assertion Failed
Dbgheap.c Line 1017 _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

 
Si je commente la variable COleDropTarget je n'ai plus d'erreur.
 
La partie du code que je soupsonne concerne la synchronisation de la comboBox.
 
Détail  
(mon algo n'est peut être pas le mieux qu'on puisse faire... désolé)
 
Pour synchroniser la Combo avec la TreeView. je procede en 2 étapes:
 
Etape 1:
Lors du 1er affichage de ma sdi, je sauvegarde les éléments de la combo ds un Vector.Celui-ci contient des ptr* sur des structures COMBOBOXEXITEM cbi( Ouf...).
 
Voici un exemple d'affichage de la combo et de la treeView  
Exemple de la treeView                     Exemple de la Combo
 
Poste de travail                           Poste de travail
c:\                                        c:\
D:\                                        D:\
E:\                                        E:\
etc...
 
le Code de sauvegarde de la combo:

Code :
  1. COMBOBOXEXITEM* pCBItem;
  2. CString * strAdresse2 ;
  3. //Boucle pr recup des entrées de la combo
  4. for(int v = 0; v < m_pCombBoxEx->GetCount(); v++)
  5. {
  6.      pCBItem = new COMBOBOXEXITEM;
  7.      pCBItem->mask = CBEIF_TEXT | CBEIF_IMAGE | CBEIF_SELECTEDIMAGE |
  8.                     CBEIF_OVERLAY | CBEIF_INDENT;
  9.      pCBItem->iItem = v;
  10.      strAdresse2 = new CString ;
  11.      pCBItem->pszText =  (LPTSTR)(LPCTSTR)strAdresse2;
  12.      //pCBItem->pszText =  (LPTSTR)(LPCTSTR)strAdresse2;
  13.      pCBItem->cchTextMax = 256;
  14.      m_pCombBoxEx->GetItem(pCBItem);
  15.      strItemComboVectSov.push_back(pCBItem);
  16. }


 
Etape 2:
Ensuite pour afficher dans la combo le rep développé ds la treeView j'interviens
dans lévénement OnSelchanged de cette dernière où je copies mon vectorSov(que je ne modifies jamais) dans 1 autre Vector tompon qui lui integrera les nouveaux éléments à afficher à chaque fois que l'événement se produit.
 
Exemple de la treeView                     Exemple de la Combo
 
Poste de travail                           Poste de travail
c:\                                        c:\
   Rep1                                       Rep3
   Rep2                                         SsRep3
   Rep3                                    D:\
      SsRep1                               E:\                              
      SsRep2                                
      SsRep3
   Rep4
   Rep5
D:\
E:\
 
j'effectue bien le delete de mon Vector  tompon.
 
Est-ce que quelqu'un pourrait m'éclairer SVP ?
 

Reply

Marsh Posté le 16-04-2005 à 20:52:57   

Reply

Marsh Posté le 16-04-2005 à 23:59:54    

said01 a écrit :


     strAdresse2 = new CString ;
 
     pCBItem->pszText =  (LPTSTR)(LPCTSTR)strAdresse2;
 
[/cpp]


 
hum, deux casts violents de suite, ca me fait un peu peur.
A mon avis ca marcherait mieux si tu faisais  

Code :
  1. char *ptBuffer = new char[256];
  2. pCBItem->pszText =  ptBuffer ;


 
bon ca fait allouer 256 caractères pour chaque entrée mais si tu veux vraiment stocker des COMBOBOXEXITEM dans ton vector y a pas trop le choix a mon avis.
 
tu pourrais faire comme ca :

Code :
  1. CString ficelle;
  2. pCBItem->pszText =  ficelle.GetBuffer(256);
  3. pCBItem->cchTextMax = 256;
  4. m_pCombBoxEx->GetItem(pCBItem);
  5. ficelle.ReleaseBuffer();


 
mais la variable ficelle va être détruite a la fin du bloc d'instructions et pszText va pointer n'ilmporte quoi.
 
Une meilleure solution serait de te faire une structure qui contient les infos qui sont vraiment interressantes (dont le nom que tu veux récupérer) et faire un vector avec cette structure.
 
pourquoi tu te fait un vector de pointeurs de COMBOBOXEXITEM et pas un vector de COMBOBOXEXITEM ?

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed