IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

delete h�ritage structure


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 108
    Par d�faut delete h�ritage structure
    J'ai une question?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    // J'utilise Visual C++ .Net 2003.
    // Exemple: J'ai une structure dérivée.
     
    struct Structure_Derived: public Structure_Origine
    {
          int nombre;
    }
     
    // Je créer une structure. et 2 pointeurs.
     
    Structure_Derived* DER;
    Structure_Origine* ORI;
     
    DER = new Structure_Derived;
    ORI = DER;
     
     
    // ces 2 façons de détruire la Structure sont-t-elle égale?
    // y a-t-il des fuites de mémoire avec une des 2 façons?
     
    // facon 1.
    delete DER;
     
    // facon 2.
    delete ORI;
    Merci.

  2. #2
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 108
    Par d�faut
    d�sol� j'ai oubli� de convertir. pour cette partie.

    Je cr�er une structure. et 2 pointeurs.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    Structure_Derived* DER;
    Structure_Origine* ORI;
     
    DER = new Structure_Derived;
    ORI = (Structure_Origine*)DER;

  3. #3
    Membre chevronn�
    Profil pro
    Inscrit en
    F�vrier 2008
    Messages
    439
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : F�vrier 2008
    Messages : 439
    Par d�faut
    Citation Envoy� par demss Voir le message
    //d�sol� j'ai oubli� de convertir. pour cette partie.
    Surtout, ce que tu as oubli�, c'est la d�finition de Structure_Origine.

    Bref, un programme complet (et compilable), c'est l'id�al dans les cas simples comme celui-ci.

  4. #4
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    ORI = (Structure_Origine*)DER;
    ORI = DER;
    Ces deux code sont strictement �quivalents dans la cas que tu nous montre. Un pointeur sur un classe d�riv�e est silencieusement castable en pointeur sur classe de base.

    Pour la destruction, � condition que Structure_Origine poss�de un destructeur virtuel, les deux codes sont identiques. Si ce n'est pas le cas, le code :
    est ill�gal, et peut tout faire, de la fuite m�moire au plantage.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  5. #5
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 108
    Par d�faut
    Merci JolyLoic pour ta r�ponce.

    ta raison j'avais pas besoin de convertir moi m�me.

    Je me demandais si il d�truisait juste la partie Structure_Origine avec "delete ORI;" et la partie d�riv� aurai �t� une fuite de m�moire.



    Si j'ai bien comprit:
    avec "delete ORI;" il d�truit pas la m�me chose que "delete DER;".
    si la structure Structure_Origine a pas de destructeur virtuel.


    Si ma Structure_Origine =
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    struct Structure_Origine
    {
         int jaja;
         float lala;
         ~ Structure_Origine();
    };
    les 2 delete son �quivalent.


    et Si ma Structure_Origine =
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    struct Structure_Origine
    {
         int jaja;
         float lala;
    };
    avec "delete ORI;" il y a pas de fuite de m�moire.
    et avec "delete DER;" il y a fuite de m�moire.



    Ma vrai structure origine est la structure D3DXMESHCONTAINER dans DirectX.
    et dans un exemple du SDK cette structure est d�riv� D3DXMESHCONTAINER_DERIVED.

    ca cr�ation est un new D3DXMESHCONTAINER_DERIVED.

    pour ca destruction elle est retrouner par un pointeur de sa struct origine.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    destroy(D3DXMESHCONTAINER* meshc)
    {
     
    // elle est convertie en sa dérivé.
    D3DXMESHCONTAINER_DERIVED* Meshderi = (D3DXMESHCONTAINER_DERIVED*) meshc;
     
    // elle est délité comme ca.
    delete Meshderi;
    }
    allor il y a fuite de m�moire ici.
    si il aurai mit a la place "delete meshc;". tout aurait �t� OK.


    Dite moi si j'ai bien comprit.

    Merci.

  6. #6
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Formellement, il ne s'agit pas simplement d'une fuite de m�moire, mais d'une comportement ind�termin�, qui peut donc avoir des cons�quences plus grave. En pratique, avec des simples structures, il y a des chances que ce comportement ind�termin� se transmute en simple fuite de m�moire.

    Dans le code que tu montres, il y a justement l'effet oppos�. Pour �viter ce comportement ind�termin�, le code va explicitement caster vers le type d�riv� avant de d�truire. Dans le code en question, c'est s'il avait dait un simple "delete meshc;" que le comportement ind�termin� aurait eu lieu.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  7. #7
    Membre confirm�
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    108
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 108
    Par d�faut
    Merci pour vos r�ponce.

    D'apr�s ce que je peux voir, il est impossible de savoir si la structure D3DXFRAME_DERIVED est bien d�lit�.


    J'ai trouver ca dans d3dx9anim.h dans le dossier include du SDK DirectX 9.0.
    pour la classe de basse ou l'interface COM de base.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
     
    #undef INTERFACE
    #define INTERFACE ID3DXAllocateHierarchy
     
    //----------------------------------------------------------------------------
    // This interface is implemented by the application to allocate/free frame and
    // mesh container objects. Methods on this are called during loading and
    // destroying frame hierarchies
    //----------------------------------------------------------------------------
    //////////////////////////////////////////////////////////////////////////////
    // ID3DXAllocateHierarchy ////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////
    DECLARE_INTERFACE(ID3DXAllocateHierarchy)
    {
        // ID3DXAllocateHierarchy
     
    	//------------------------------------------------------------------------
    	// CreateFrame:
    	// ------------
    	// Requests allocation of a frame object.
    	//
    	// Parameters:
    	//  Name
    	//		Name of the frame to be created
    	//	ppNewFrame
    	//		Returns returns the created frame object
    	//
    	//------------------------------------------------------------------------
        STDMETHOD(CreateFrame)(THIS_ LPCSTR Name, 
                                LPD3DXFRAME *ppNewFrame) PURE;
     
    	//------------------------------------------------------------------------
    	// CreateMeshContainer:
    	// --------------------
    	// Requests allocation of a mesh container object.
    	//
    	// Parameters:
    	//  Name
    	//		Name of the mesh
    	//	pMesh
    	//		Pointer to the mesh object if basic polygon data found
    	//	pPMesh
    	//		Pointer to the progressive mesh object if progressive mesh data found
    	//	pPatchMesh
    	//		Pointer to the patch mesh object if patch data found
    	//	pMaterials
    	//		Array of materials used in the mesh
    	//	pEffectInstances
    	//		Array of effect instances used in the mesh
    	//	NumMaterials
    	//		Num elements in the pMaterials array
    	//	pAdjacency
    	//		Adjacency array for the mesh
    	//	pSkinInfo
    	//		Pointer to the skininfo object if the mesh is skinned
    	//	pBoneNames
    	//		Array of names, one for each bone in the skinned mesh. 
    	//		The numberof bones can be found from the pSkinMesh object
    	//	pBoneOffsetMatrices
    	//		Array of matrices, one for each bone in the skinned mesh.
    	//
    	//------------------------------------------------------------------------
        STDMETHOD(CreateMeshContainer)(THIS_ LPCSTR Name, LPD3DXMESHDATA pMeshData, 
                                LPD3DXMATERIAL pMaterials, LPD3DXEFFECTINSTANCE pEffectInstances, DWORD NumMaterials, 
                                DWORD *pAdjacency, LPD3DXSKININFO pSkinInfo, 
                                LPD3DXMESHCONTAINER *ppNewMeshContainer) PURE;
     
    	//------------------------------------------------------------------------
    	// DestroyFrame:
    	// -------------
    	// Requests de-allocation of a frame object.
    	//
    	// Parameters:
    	//  pFrameToFree
    	//		Pointer to the frame to be de-allocated
    	//
    	//------------------------------------------------------------------------
        STDMETHOD(DestroyFrame)(THIS_ LPD3DXFRAME pFrameToFree) PURE; 
     
    	//------------------------------------------------------------------------
    	// DestroyMeshContainer:
    	// ---------------------
    	// Requests de-allocation of a mesh container object.
    	//
    	// Parameters:
    	//  pMeshContainerToFree
    	//		Pointer to the mesh container object to be de-allocated
    	//
    	//------------------------------------------------------------------------
        STDMETHOD(DestroyMeshContainer)(THIS_ LPD3DXMESHCONTAINER pMeshContainerToFree) PURE; 
    };
    J'aimerai savoir si je change le code pour �a si �a assure un bon delete � 100 pour 100 pour la Structure d�riv�.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    HRESULT CAllocateHierarchy::DestroyFrame(LPD3DXFRAME pFrameToFree) 
    {
        D3DXFRAME_DERIVED *pFrameToFree_derived = (D3DXFRAME_DERIVED*)pFrameToFree;
     
        SAFE_DELETE_ARRAY( pFrameToFree_derived->Name );
        SAFE_DELETE( pFrameToFree_derived);
        return S_OK; 
    }
    Merci.

  8. #8
    Expert �minent
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par d�faut
    Wow, �a, c'est pas commun: Une interface qui ne d�rive pas de IUnknown. Donc, dans cette version de DirectX, ce ne serait pas une interface COM ?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. [AC-2007] Formulaire pour structure mod�lis�e par h�ritage
    Par f-leb dans le forum IHM
    R�ponses: 3
    Dernier message: 12/06/2009, 09h48
  2. R�ponses: 5
    Dernier message: 21/11/2008, 14h43
  3. H�ritage de structure en C
    Par Fred.77 dans le forum C
    R�ponses: 12
    Dernier message: 03/11/2007, 19h33
  4. delete d'une structure
    Par mathher dans le forum C++
    R�ponses: 7
    Dernier message: 20/04/2006, 15h20
  5. surcharge operateur delete et h�ritage
    Par Herv� dans le forum C++
    R�ponses: 5
    Dernier message: 29/03/2006, 13h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo