Probleme avec new

Résolu
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009 - 26 mai 2006 à 15:21
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009 - 26 mai 2006 à 18:47
Bonjour!


J'ai un probleme tres etrange et j'aimerai savoir si quelqu'un a deja
eu un probleme de ce genre, ou a une piste pour le resoudre.

Je programme avec Visual Studio 2003 pro, et je programme un mmorpg.
Pour pouvoir avoir plusieurs persos j'utilise une liste chainée de
classes de persos. Voila la fonction qui permet de recupérer un perso
soit non utilisé, soit d'en créer un nouveau si les autres sont
utilisés:


    CPerso *CPerso::List_GetFree()

    {

        CPerso *ls;

        if(Root==NULL)

            return NULL;


        for(ls = Root; ls != NULL && ls->used != false; ls = ls->Next);


        if(ls!=NULL)

            return ls;


//        exit(5);

        CPerso *nper = new CPerso;

//        exit(5);

        List_Add(nper);

        return nper;

    }


Le bug etrange maintenant, c'est que quand je lance le programme en
mode debuggage (F5 sur vs) il n'y a pas de probleme, je peux etre a 3
sur la meme map (j'ai pas essayé plus). En revanche si je lance l'exe,
ca plante, meme si le deuxieme exit(5) est decommenté. Si je decommente
le premier exit(5), il n'y a pas de probleme, ca quitte le prog sans
bug. Donc j'en ai deduit que c'est le new...


Je pensais que le new plantait que s'il n'avait pas assez de mémoire
libre, mais la c'est bizarre.. (puisqu'avec f5 ca marche nikel, et la
mémoire utilisée est stable)


Quelqu'un a une idée ?

6 réponses

BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
26 mai 2006 à 18:47
dsl pour le triple posting mais ya encore du nouveau... pire que tout... Voila la classe CNVOImage:


//-----------------------------------------------------------------------------

// Nom:  class CNVOImage

// Desc: Contient une image et ses fonctions d'affichage.

//-----------------------------------------------------------------------------

class CNVOImage


{

public:

    CNVOImage();

    ~CNVOImage();


    LPDIRECT3DVERTEXBUFFER9    m_pVB;

    LPDIRECT3DDEVICE9        m_pd3dDevice;


    D3DXVECTOR3 ScaleCenter;

    D3DXVECTOR3 ScaleRotation;

    D3DXVECTOR3 Scale;

    D3DXVECTOR3 RotationCenter;

    D3DXVECTOR3 Rotation;

    D3DXVECTOR3 Position;


    DWORD m_dwWidth;

    DWORD m_dwHeight;


//    bool instance;

   

    CULLINFO* m_pCullInfo;


    D3DXVECTOR3 
*m_vecBoundsLocal;     // bounding box coordinates
(in local coord space)

    D3DXVECTOR3  m_vecBoundsWorld[8];   // bounding box coordinates (in world coord space)

    D3DXPLANE    m_planeBoundsWorld[6]; // bounding box planes (in world coord space)

    CULLSTATE   
m_cullstate;            //
whether object is in the view frustum


    LPDIRECT3DTEXTURE9*        m_pTexture;


    inline LPDIRECT3DTEXTURE9 GetTexture(int iIndex) { return m_pTexture[iIndex]; }


    void GetWorldMatrix(D3DXMATRIX* matWorld);

    HRESULT Instantiate(CNVOImage *psrc);

    HRESULT SetSrcRect(SNVORect *rcSrc);

    HRESULT SetDestRect(SNVORect *rcDest);

    HRESULT SetSize(float fWidth, float fHeight);

    HRESULT SetColor(DWORD dwColor, int iCorner = 0);

    HRESULT LoadImage(LPDIRECT3DDEVICE9 pDevice, char *pcFilename, SNVOImgLoadFlag *sLoadflag);

    HRESULT LoadTexture(LPDIRECT3DDEVICE9 pDevice, char *pcFilename, int iIndex = 0);

    HRESULT MakeNormalMap(WORD iIndex);

    HRESULT SetCamera(CNVOCamera *Cam);

    HRESULT Draw();

    HRESULT PreDraw();

    HRESULT PostDraw();

};


en gros comme ca ca marche, si je decommente instance ca plante, mais
si je change par exemple DWORD m_dwWidth en WORD en plus, ca remarche!
C'est pas possible qu'une classe bug a l'octel pret comme ca
>_<;;; Avec un compteur static j'arrive avec 68 images
chargées... (61 en comptant les déchargées)


Ah! je viens de changer un truc là... j'ai viré le menu ingame (c'est pas moi qui l'ai fait, c'est mon pote )
et je suis descendu a 4 images (chargées - déchargées)... vais lui
demander d'optimiser ca puisque maintenant debug et exe marchent ^^


bon ben merci pour ton aide bouba ^^


(sujet clos?)
3
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
26 mai 2006 à 15:34
Slt, quel est le code de ta classe CPerso, le constructeur en particulier ?
0
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
26 mai 2006 à 16:04
CPerso::CPerso()

{

    Img = new CNVOImage;

    m_TileSetRect = new SNVORect[25];

    State = PSTATE_WALK;

    Move = 0;

    id = 0;

    for_right = 0;

    for_left = 0;

    for_up = 0;

    for_down = 0;

    to_x = 0;

    to_y = 0;

    Next = NULL;

    used = false;

    Arg1 = 0;

}


CPerso::~CPerso()

{

    delete Img;

    delete[25] m_TileSetRect;

}


Le code est un peu gros je met que le constructeur et destructeur ...
0
cs_bouba Messages postés 518 Date d'inscription dimanche 2 décembre 2001 Statut Membre Dernière intervention 10 novembre 2007 3
26 mai 2006 à 16:20
Le constructeur à l'air OK, si les constructeurs CNVOImage et SNVORect le sont aussi ça devrait être bon. Par contre tu as essayé en mettant un exit() après le List_Add ? Comment sont gérées tes listes ? Ca arrive qu'un prog ne plante pas en debug mais plante en release, le truc c'est que tu accèdes à des zones mémoires où tu ne devrais pas accéder. Vérifies nickel les constructeurs de CNVOImage et SNVORect, ensuite faits un test en créant style 200 CPerso pour voir (en désallouant correctement), je ne suis pas sûr que le problème vienne du new.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
26 mai 2006 à 17:39
Hmm... ya un peu de nouveau :/ j'avais oublié de mettre un destructeur
pour CNVOImage donc je l'ai rajouté... mais maintenant ca bug avec f5,
au meme endroit, mais plus precisément dans le constructeur de
CNVOImage, au new de m_pTexture = new LPDIRECT3DTEXTURE9[MULTITEX_MAX];
qui renvoie un pointeur nul. (juste pour le new du CPerso en question
puisqu'il charge d'autres images avant et les affiche sans probleme).

Avant d'avoir fait ca j'ai essayé de rajouter un tableau de 200 CPerso et ca marchait bien en debug.


struct SNVORect



{



    float x1, y1;



    float x2, y2;




    SNVORect(float _x1, float _y1, float _x2, float _y2) { x1=_x1;y1=_y1;x2=_x2;y2=_y2; }



    SNVORect() {}



};


//-----------------------------------------------------------------------------

// Nom:  CNVOImage::CNVOImage()

// Desc: Construit la classe

//-----------------------------------------------------------------------------

CNVOImage::CNVOImage()

{

    m_pTexture = new LPDIRECT3DTEXTURE9[MULTITEX_MAX];

    ZeroMemory(m_pTexture,sizeof(LPDIRECT3DTEXTURE9)*MULTITEX_MAX);

    ScaleCenter = D3DXVECTOR3(0, 0, 0);

    ScaleRotation = D3DXVECTOR3(0, 0, 0);

    Scale = D3DXVECTOR3(1, 1, 1);

    RotationCenter = D3DXVECTOR3(0, 0, 0);

    Rotation = D3DXVECTOR3(0, 0, 0);

    Position = D3DXVECTOR3(0, 0, 0);

    m_cullstate = CS_UNKNOWN;

    m_pCullInfo = NULL;

    m_vecBoundsLocal = new D3DXVECTOR3[8];

    instance = false;

}


//-----------------------------------------------------------------------------

// Nom:  CNVOImage::~CNVOImage()

// Desc: Detruit la classe

//-----------------------------------------------------------------------------

CNVOImage::~CNVOImage()

{

    if(!instance)

    {

        delete[MULTITEX_MAX] m_pTexture;

        delete[8] m_vecBoundsLocal;

    }

}
0
BumpMANN Messages postés 330 Date d'inscription jeudi 22 mai 2003 Statut Membre Dernière intervention 26 janvier 2009
26 mai 2006 à 17:48
encore pire... j'ai retiré ma modif avec instance (et ca a remarché),
et j'ai juste remis bool instance; dans ma classe et hop ca plante ^^;;;
0
Rejoignez-nous