none
disponibilité d'une instance d'une classe RRS feed

  • Question

  • Bonjour,
    après que, dans mon application principale, une instruction instancie une classe par l'opérateur new, existe-t-il un méchanisme standard qui permet de s'assurer que cette instance a fini de s'initialiser. Les membres de cette instance  peuvent alors  être sollicitées par l'application principale.

    ps: j'ai un programme qui plante juste après la création d'une dizaine d'instances d'une même classe, mais lorsque je tente de le débuguer il ne se plante pas...
    Bernard
    mardi 16 mars 2010 15:13

Réponses

  • Bonjour,
    en effet, trop content de trouver un piste je suis parti sur une mauvaise. J'ai compris un peu mieux comment lire les infos du débogueur.
    Il faut que je me concentre sur ce qui ce passe dans la classe CCellule et je poserais une question certainement sur autre thème plus tard: peut-être une mauvaise utilisation de CSimpleStringT::GetLength.

    merci,
    Bernard
    mercredi 17 mars 2010 16:57

Toutes les réponses

  • Une instance a finie son initialisation au retour de new. Par initialisation, c'est l'action de son constructeur.
    Donc le problème est bien plus spécifique à votre classe d'objet qu'aux mécanismes généraux du C++.
    Paul Bacelar, Ex - MVP VC++
    mercredi 17 mars 2010 07:24
    Modérateur
  • Bon, OK la chose est dite!
    il y a donc un problème ailleurs et je vais commencer par soumettre à votre critique le code où j'utilise l'opérateur new.
    J'explique d'abord ce que je voudrais faire: créer 16 instances d'une classe appellée CCellule. Cette classe a été définie avec un constructeur qui prend deux int H et V pour l'initialisation.
    Pour une raison légitime je veux représenter ces 16 instances sous forme d'un tableau 4x4 (je le précise pour le cas où ce serait une erreur).
    voici le code dans mon application principale:

    CCellule** pCellHV;



    pCellHV =



    pCellHV =

    new CCellule*[16];
    int H;
    int V;

     

    for ( H = 0; H < 16; )// H est incrménté dans la boucle
    {

     

          for ( V = 0; V < 4; V++)
          { 
               pCell[H+V] =
    new CCellule(H, V*4);
          }
         
          H += V;
    }

     Il y a un problème (à ce qu'il me semble) qui apparait lors du déboguage:
    Au cours des 16 passages dans la boucle, pCell[H+V] reprend toujours la même valeur du genre 0x003dc7c8. Ce qui semble indiquer que je n'ai créé qu'une seule instance écrasée à chaque passage dans la boucle.
    Pouvez vous m'expliquer ce que je n'ai pas compris.

    Bernard

    mercredi 17 mars 2010 11:07
  • J'envoie à nouveau le code qui n'a pas supporté le copier-coller...

    CCellule** pCellHV;

    pCellHV = new CCellule*[16];
    int H;
    int V;

    for( H = 0; H < 16; )// H est incrémenté dans la boucle
    {
       for ( V = 0; V < 4; V++ )
       {
           pCellHV[H+V] = new CCellule(H, V*4);
       }
       H += V;
    }
    mercredi 17 mars 2010 11:16
  • Bonjour,

     

    Que contient le constructeur de la classe CCellule ? S’il a des ressources à gérer, le problème peut venir de ce côté.

     

    J’ai testé votre code et la valeur de pCellHV[H+V] change à chaque allocation. Attention, à ne pas confondre avec la valeur de pCellHV qu’on voit dans la fenêtre Locals en mode debug, car pCellHV simple est juste le pointeur, qui ne change pas.

     

    Cordialement,

    Alex


    Alex Petrescu - MSFT
    mercredi 17 mars 2010 16:09
  • Bonjour,
    en effet, trop content de trouver un piste je suis parti sur une mauvaise. J'ai compris un peu mieux comment lire les infos du débogueur.
    Il faut que je me concentre sur ce qui ce passe dans la classe CCellule et je poserais une question certainement sur autre thème plus tard: peut-être une mauvaise utilisation de CSimpleStringT::GetLength.

    merci,
    Bernard
    mercredi 17 mars 2010 16:57