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 :

auto_ptr


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    11
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 11
    Par d�faut auto_ptr
    je voudrais verifier que je n'ai auceune fuite de memoire dans mon programme qui ressemble a ca:

    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
     
     
     
    #include<iostream>
    #include<memory>
     
    using namespace std;
     
     
     
     
     
    class A{
    public:
      A() : pa(new int){}
      ~A() {delete pa;}
     
      virtual void fn() {cout << "Class A" << endl;}
     
    private:
      int* pa;
    }; 
     
     
     
    class B : public A{
    public:
      B() : pb(new int){}
      ~B() {delete pb;}
     
      void fn() {cout << "Class B" << endl;}
     
    private:
      int* pb;
    };
     
     
    class C :public A{
    public:
      C() : pc(new int){}
      ~C() {delete pc;}
     
      void fn() {cout << "Class C" << endl;}
     
    private:
      int* pc;
    };
     
     
     
    int main (){
     
    auto_ptr<A> a1(new B());
    C c;
    A& a2 = c;
    a1->fn();
    a2.fn();
     
     
    system("pause");
    return 0;
     
    }
    le destructeur de A n'est pas virtuel. lorsque je cree a1 j'instancie un objet B derive de A.

    auto_ptr s'occupe de liberer la memoire lorsque a1 n'est plus utilise. est ce que cela marche toujours lorsque a1 est instancie comme objet de type B derive de A. faut-il que je declare le destructeur de A virtuel.

    en une question . est ce que mon code a des fuite de memoire?



    merci.

    katous

  2. #2
    Membre averti
    Inscrit en
    F�vrier 2004
    Messages
    21
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2004
    Messages : 21
    Par d�faut
    Il existe des API et des logiciels qui r�pondront mieux � ta question, et ce, m�me sur des programmes beaucoup plus complexes.

    fuite m�moire ou memory leak sur google. (J'avoue, j'ai eu la flemme de chercher).

  3. #3
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    Oui, tu as une fuite m�moire car le destructeur de B ne sera pas appel� (celui de C non plus). Et donc oui, la solution est de d�clarer celui de A virtuel

    Et attention avec les auto_ptr, c'est tr�s vicieux.

  4. #4
    Membre averti
    Inscrit en
    Janvier 2004
    Messages
    11
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 11
    Par d�faut
    si je comprend bien auto_ptr liberera seulement la memoire de a1 en tant qu'objet de type A.

    si je declare le destructeur de A virtuel les destructeurs de B et C (objet derives) seront appele lorsque le destructeur de A sera appele



    katous

  5. #5
    Membre chevronn�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par d�faut
    Tu as surtout du code qui a un comportement ind�fini.
    D�truire un objet qui a pour type statique une classe de base et pour type dynamique une classe d�riv�e alors que le destructeur de la classe de base n'est pas virtuel implique un comportement ind�fini.
    Au mieux, tu as une fuite de m�moire car le destructeur de la classe d�riv�e n'est pas appel�e.
    Au pire, tu peux avoir n'importe quoi, mais surement un plantage.

    En revanche si tu remplaces la ligne :
    par :
    alors, il n'y a plus de probl�me.

  6. #6
    R�dacteur
    Avatar de Laurent Gomila
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par d�faut
    si je comprend bien auto_ptr liberera seulement la memoire de a1 en tant qu'objet de type A.

    si je declare le destructeur de A virtuel les destructeurs de B et C (objet derives) seront appele lorsque le destructeur de A sera appele
    Tout � fait.

    Tu as surtout du code qui a un comportement ind�fini
    C'est pas si s�r, � mon avis le comportement est bien d�fini : seul le destructeur de A sera appel�, et pas ceux des classes d�riv�es.

  7. #7
    Membre chevronn�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par d�faut
    @Loulou24
    En pratique, tu as raison. En th�orie, ce cas est recens� comme menant � un comportement ind�fini.

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. R�ponses: 26
    Dernier message: 13/01/2008, 15h28
  2. [g++] auto_ptr test si NULL
    Par gorgonite dans le forum Autres �diteurs
    R�ponses: 6
    Dernier message: 07/01/2007, 18h58
  3. std::auto_ptr et delete[]
    Par Herode dans le forum SL & STL
    R�ponses: 11
    Dernier message: 14/02/2006, 22h56
  4. [debutant] std::auto_ptr<>
    Par Meno dans le forum SL & STL
    R�ponses: 8
    Dernier message: 26/10/2005, 10h27
  5. Probleme de auto_ptr avec les map
    Par Luther dans le forum C++
    R�ponses: 8
    Dernier message: 08/04/2005, 10h49

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