Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.3.1 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Les pointers

Voilà, je me met petit à petit au C++. Mais il me manque un gros point que je n'arrive pas à assimiler: Les pointers...
Bon, j'ai lue tout ce qu'on pouvait lire à propos du sujet mais ...

Donc voilà pour récapituler ce que j'ai compris (merci de m'arreter si je me trompe):
- Un pointer c'est une adresse qui pointe sur l'adresse d'une autre variable.
- Celà permet de ne pas perdre ses variables quand la fonction se termine.

Ok jusqu'a là, je comprends tout (mais quel génie ;)).
Mais on utilise le C++ pour faire de l'OOP (object). Donc on peut déclarer ses variables (int, float, QString etc.) dans sa class et dans toutes les fonctions les utiliser.
Dans ce cas pourquoi utiliser un pointer dans une class !?
class A {
public:
A();

private:
int foo;
void bar();
};

A::A() {
foo = 150;
}

void A::bar() {
std::cout << a << std::endl; // a = 150
}
la fonction bar() peut très bien accèder à foo et je n'ai pas utiliser l'ombre d'un pointer :/.

Je ne suis pas très malin donc j'ai décider d'ignorer mon ignorance :P et de continuer "au filling"...
Mais en jettant un coup d'oeuil sur mes applications avec Valgrind, je me suis apercu que j'avais quelques bytes perdues à chaque utilisation d'un pointer:
class MyWidget : public QWidget {
Q_OBJECT

public:
MyWidget();

private:
QPushButton *button;
};

MyWidget::MyWidget() {
button = new QPushButton("Hello", this); // paff une fuite de mémoire
...
}
Je pourrais détruire (delete) mes pointer mais normalement, on veut pas qu'un des boutons de son application disparaisse en cours d'exécution...

Donc j'aimerais avoir des exemples concrets ou l'utilisation des pointers est indispensable. Parce ca ne veut pas rentrer dans ma petite cervelle :)

Merci d'avance :D

Réponses

  • Reponse super rapide :
    utiliser un pointeur permet de partager une meme variable/un meme objet entre deux ou plusieurs "classes" (classe est un mot mal choisi).
    par exemple :
    int a=42;
    class A
    {
    int *_ptr;
    public:
    A(int *ptr)
    {
    _ptr=ptr;
    }
    void print()
    {
    printf("%d\n",*_ptr);
    }
    }
    A c1(&a);
    A c2(&a);
    c1.print();
    c2.print();
    //bon si je modife a j'impacte a la fois c1 et c2
    a=21;
    c1.print();
    c2.print();
    Le probleme dans ton exemple c'est que QT s'occupe tou seul de ses petits :
    MyWidget::MyWidget() {
    button = new QPushButton("Hello", this); // paff une fuite de mémoire
    ...
    }
    La theorie voudrait que detruire MyWidget détruise automatiquement button.

    Ludo
  • Merci pour la réponse aussi rapide (et l'exemple est parfait :)).
    Là je veux bien que utiliser un pointer pour les deux objets c1 et c2 soit utilise mais je ne comprends toujours pas pourquoi dans énormément d'exemples, des variables privées (private) d'une class sont des pointers (on ne peut pas y accèder de l'exterieur (private) et on peut de toute facon y acceder de l'interieur)...

    Pour ce qui est de la destruction des enfants automatiquement, c'est ce qu'on m'avait expliquer auparavant:
          x <- si ou détruit cet "element" ... tout ce casse la geule (ses enfants sont détruit également)
    / \
    x x
    / \
    x x
    /
    x
    Mais pourquoi Valgrind m'indique qu'il y à des fuites de mémoire !?
  • Dans l'exemple que tu donnes, le QPushButton pourrait en effet être un objet de QPushButton, et non un pointeur. Ca reviendrait à peu près au même... la différence venant il me semble de l'endroit où la mémoire est alloué.

    Je vois par contre deux intérêts à l'utilisation de pointeurs :
    - pouvior partager les données sans faire de recopie,
    - pouvoir utiliser l'un des fondements de la programmation objet : le polymorphisme.

    Pour reprendre ton exemple où tu ne comprends pas l'intérêts d'avoir un pointeur en membre private, il y a plusieurs possibilités :
    - il est extérieur à la classe (et il y a des accesseurs et mutateurs),
    - il n'est pas définit au départ, pour éviter de prendre de la mémoire inutilement, ou parce qu'on ne sait pas encore le définir,
    - c'est une classe mère (ou abstraite), la création se fera plus tard en indiquant quelle classe fille utilisée (utilisation du polymorphisme).

    Au niveau de la destruction, le fait que les enfants soient détruits n'est valable que pour les QObjects... attention sinon aux fuites mémoires. Pour le problème de fuites mémoires avec l'utilisation de pointeurs, je ne sais pas quoi te dire...
  • Red Rabbit said:
    Merci pour la réponse aussi rapide (et l'exemple est parfait :)).
    Là je veux bien que utiliser un pointer pour les deux objets c1 et c2 soit utilise mais je ne comprends toujours pas pourquoi dans énormément d'exemples, des variables privées (private) d'une class sont des pointers (on ne peut pas y accèder de l'exterieur (private) et on peut de toute facon y acceder de l'interieur)...
    Comme tu t'en doute on pourrait remplir des livres entiers sur les pointeurs.
    Je veux bien tu me soumette un exemple en particulier.
    On pourra toujours tenter d'analyser les choix de pointeur - (c'est peut etre tout simplement mal code ;) )
    Pour ce qui est de la destruction des enfants automatiquement, c'est ce qu'on m'avait expliquer auparavant:
          x <- si ou détruit cet "element" ... tout ce casse la geule (ses enfants sont détruit également)
    / \
    x x
    / \
    x x
    /
    x
    Mais pourquoi Valgrind m'indique qu'il y à des fuites de mémoire !?
    ???, je ne sais pas (en fait certaines fuites peuvent s'expliquer) - tu pourrais fournir ton code d'exemple et/ou la sortie de valgrind ?

    Ludo
  • December 2006 modifié
    Au niveau des pointeurs en private, c'est souvent parce que:
    * tu ne peux les instancier qu'en dynamique car tu dois attendre qu'un objet clé du framework soit créé
    * tu déclares un ensemble de gros objets, qui, s'ils sont alloués sur la pile la ferait littéralement péter.

    Edit: pour valgrind, je suppose très fortement qu'il surveille les allocations/désallocations au niveau du programme, pas des librairies. Ce qui expliquerait les pseudo fuites mémoires détectées
  • Donc tout ca reste plus ou moins une histoire de filling ;)

    @IrmatDen: tu déclares un ensemble de gros objets, qui, s'ils sont alloués sur la pile la ferait littéralement péter Si tu pouvais développer ca m'aiderais énormément :)
    @nikikko: pouvoir partager les données sans faire de recopié Parles tu de la mémoire ? Est-ce que dans une class une variable "globale" est (re-)copiée pour chaque fonction membre qui l'utilise ?
    Pour ce qui est du polymorphisme, le PHP est type-free donc :P Et je n'ai pas encore eu l'occasion de m'enfoncer dans ce sujet (one day ... maybe).

    Et pour mon histoire d'analyse Valgrind, il est fort possible que IrmatDen est raison et qu'il ne sagisse pas de réelle fuites (dans ce cas, y à t'il une possibilitée d'utiliser ce tool autrement pour analyser mon code uniquement ?
    #include <QtGui>
    #include <QApplication>

    class MyWidget : public QWidget {
    public:
    MyWidget();

    private:
    QPushButton *button;
    };

    MyWidget::MyWidget() {
    button = new QPushButton("hello", this);
    }

    int main(int argc, char * argv[]) {
    QApplication app(argc, argv);

    MyWidget widget;
    widget.show();

    return app.exec();
    }
    Et le "log" de l'analyse:
    ==20295== Invalid read of size 8
    ==20295== at 0x4014BA1: (within /lib/ld-2.4.so)
    ==20295== by 0x40110E1: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x6FB5E58: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== by 0x6FADFC0: (within /lib/libc-2.4.so)
    ==20295== by 0x6FACA00: (within /lib/libc-2.4.so)
    ==20295== Address 0x7633E40 is 72 bytes inside a block of size 73 alloc'd
    ==20295== at 0x4A2080E: malloc (vg_replace_malloc.c:149)
    ==20295== by 0x6FB5F42: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== by 0x6FADFC0: (within /lib/libc-2.4.so)
    ==20295== by 0x6FACA00: (within /lib/libc-2.4.so)
    ==20295== by 0x6FAC67F: iconv_open (in /lib/libc-2.4.so)
    ==20295== by 0x637DEE4: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x637E28B: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x6379937: QTextCodec::fromUnicode(QString const&) const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62E7100: QString::toLocal8Bit() const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62F8998: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295==
    ==20295== Invalid read of size 8
    ==20295== at 0x4014BA1: (within /lib/ld-2.4.so)
    ==20295== by 0x400755A: (within /lib/ld-2.4.so)
    ==20295== by 0x400812E: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x6FB5E58: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== Address 0x7633E40 is 72 bytes inside a block of size 73 alloc'd
    ==20295== at 0x4A2080E: malloc (vg_replace_malloc.c:149)
    ==20295== by 0x6FB5F42: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== by 0x6FADFC0: (within /lib/libc-2.4.so)
    ==20295== by 0x6FACA00: (within /lib/libc-2.4.so)
    ==20295== by 0x6FAC67F: iconv_open (in /lib/libc-2.4.so)
    ==20295== by 0x637DEE4: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x637E28B: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x6379937: QTextCodec::fromUnicode(QString const&) const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62E7100: QString::toLocal8Bit() const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62F8998: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295==
    ==20295== Invalid read of size 8
    ==20295== at 0x4014CFE: (within /lib/ld-2.4.so)
    ==20295== by 0x4007567: (within /lib/ld-2.4.so)
    ==20295== by 0x400812E: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x6FB5E58: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== Address 0x7633E40 is 72 bytes inside a block of size 73 alloc'd
    ==20295== at 0x4A2080E: malloc (vg_replace_malloc.c:149)
    ==20295== by 0x6FB5F42: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== by 0x6FADFC0: (within /lib/libc-2.4.so)
    ==20295== by 0x6FACA00: (within /lib/libc-2.4.so)
    ==20295== by 0x6FAC67F: iconv_open (in /lib/libc-2.4.so)
    ==20295== by 0x637DEE4: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x637E28B: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x6379937: QTextCodec::fromUnicode(QString const&) const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62E7100: QString::toLocal8Bit() const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62F8998: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295==
    ==20295== Invalid read of size 8
    ==20295== at 0x4014CFE: (within /lib/ld-2.4.so)
    ==20295== by 0x400A0AD: (within /lib/ld-2.4.so)
    ==20295== by 0x4005F94: (within /lib/ld-2.4.so)
    ==20295== by 0x40081D5: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x6FB5E58: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== Address 0x7633E40 is 72 bytes inside a block of size 73 alloc'd
    ==20295== at 0x4A2080E: malloc (vg_replace_malloc.c:149)
    ==20295== by 0x6FB5F42: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295== by 0x6FADFC0: (within /lib/libc-2.4.so)
    ==20295== by 0x6FACA00: (within /lib/libc-2.4.so)
    ==20295== by 0x6FAC67F: iconv_open (in /lib/libc-2.4.so)
    ==20295== by 0x637DEE4: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x637E28B: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x6379937: QTextCodec::fromUnicode(QString const&) const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62E7100: QString::toLocal8Bit() const (in /usr/lib/libQtCore.so.4.2.0)
    ==20295== by 0x62F8998: (within /usr/lib/libQtCore.so.4.2.0)
    ==20295==
    ==20295== Invalid read of size 8
    ==20295== at 0x4014CFE: (within /lib/ld-2.4.so)
    ==20295== by 0x400A29D: (within /lib/ld-2.4.so)
    ==20295== by 0x4005F94: (within /lib/ld-2.4.so)
    ==20295== by 0x40081D5: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x6FB5E58: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== Address 0x7633EE0 is 24 bytes inside a block of size 25 alloc'd
    ==20295== at 0x4A2080E: malloc (vg_replace_malloc.c:149)
    ==20295== by 0x4007573: (within /lib/ld-2.4.so)
    ==20295== by 0x400812E: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x6FB5E58: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5388: (within /lib/libc-2.4.so)
    ==20295== by 0x6FB5AAA: (within /lib/libc-2.4.so)
    ==20295==
    ==20295== Invalid read of size 8
    ==20295== at 0x4014CE4: (within /lib/ld-2.4.so)
    ==20295== by 0x400A29D: (within /lib/ld-2.4.so)
    ==20295== by 0x4005F94: (within /lib/ld-2.4.so)
    ==20295== by 0x40081D5: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x706C396: __nss_lookup_function (in /lib/libc-2.4.so)
    ==20295== by 0x70451E1: (within /lib/libc-2.4.so)
    ==20295== Address 0x76ECE88 is 16 bytes inside a block of size 23 alloc'd
    ==20295== at 0x4A2080E: malloc (vg_replace_malloc.c:149)
    ==20295== by 0x400865F: (within /lib/ld-2.4.so)
    ==20295== by 0x401119C: (within /lib/ld-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x4010C0A: (within /lib/ld-2.4.so)
    ==20295== by 0x709013F: (within /lib/libc-2.4.so)
    ==20295== by 0x400D1E5: (within /lib/ld-2.4.so)
    ==20295== by 0x70902A6: __libc_dlopen_mode (in /lib/libc-2.4.so)
    ==20295== by 0x706C396: __nss_lookup_function (in /lib/libc-2.4.so)
    ==20295== by 0x70451E1: (within /lib/libc-2.4.so)
    ==20295== by 0x7045F97: getaddrinfo (in /lib/libc-2.4.so)
    ==20295== by 0x60D0164: (within /usr/lib/libX11.so.6.2.0)
    ==20295==
    ==20295== Syscall param write(buf) points to uninitialised byte(s)
    ==20295== at 0x69F70C0: __write_nocancel (in /lib/libpthread-2.4.so)
    ==20295== by 0x60CE97E: (within /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x60D371E: (within /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x60D3810: _XReply (in /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x60BA50D: XInternAtom (in /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x60CE1F4: XSetWMProperties (in /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x4CF8CC3: QWidgetPrivate::create_sys(unsigned long, bool, bool) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CCF4C4: QWidget::create(unsigned long, bool, bool) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CD36DB: QWidget::setVisible(bool) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4026D2: QWidget::show() (qwidget.h:417)
    ==20295== by 0x402525: main (main.cpp:20)
    ==20295== Address 0x76EE5AC is 204 bytes inside a block of size 16,384 alloc'd
    ==20295== at 0x4A1FB37: calloc (vg_replace_malloc.c:279)
    ==20295== by 0x60BF436: XOpenDisplay (in /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x4CE3BFF: (within /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4C957F8: QApplicationPrivate::construct(_XDisplay*, unsigned long, unsigned long) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4C96621: QApplication::QApplication(int&, char**, int) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x402513: main (main.cpp:17)
    ==20295==
    ==20295== Syscall param write(buf) points to uninitialised byte(s)
    ==20295== at 0x69F70C0: __write_nocancel (in /lib/libpthread-2.4.so)
    ==20295== by 0x60CE97E: (within /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x60D371E: (within /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x60B02E9: XFlush (in /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x4CF4DC5: QWidgetPrivate::hide_sys() (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CCD4F9: QWidgetPrivate::hide_helper() (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CD3733: QWidget::setVisible(bool) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CD1F9C: QWidgetPrivate::close_helper(QWidgetPrivate::CloseMode) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CD57A1: (within /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CD6577: QApplication::x11ClientMessage(QWidget*, _XEvent*, bool) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4CE11F5: QApplication::x11ProcessEvent(_XEvent*) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4D02DC7: (within /usr/lib/libQtGui.so.4.2.0)
    ==20295== Address 0x76EE4F5 is 21 bytes inside a block of size 16,384 alloc'd
    ==20295== at 0x4A1FB37: calloc (vg_replace_malloc.c:279)
    ==20295== by 0x60BF436: XOpenDisplay (in /usr/lib/libX11.so.6.2.0)
    ==20295== by 0x4CE3BFF: (within /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4C957F8: QApplicationPrivate::construct(_XDisplay*, unsigned long, unsigned long) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x4C96621: QApplication::QApplication(int&, char**, int) (in /usr/lib/libQtGui.so.4.2.0)
    ==20295== by 0x402513: main (main.cpp:17)
    ==20295==
    ==20295== ERROR SUMMARY: 13 errors from 8 contexts (suppressed: 16 from 1)
    ==20295== malloc/free: in use at exit: 380,152 bytes in 3,332 blocks.
    ==20295== malloc/free: 81,684 allocs, 78,352 frees, 11,110,116 bytes allocated.
    ==20295== For counts of detected errors, rerun with: -v
    ==20295== searching for pointers to 3,332 not-freed blocks.
    ==20295== checked 1,043,688 bytes.
    ==20295==
    ==20295== LEAK SUMMARY:
    ==20295== definitely lost: 56 bytes in 2 blocks.
    ==20295== possibly lost: 0 bytes in 0 blocks.
    ==20295== still reachable: 380,096 bytes in 3,330 blocks.
    ==20295== suppressed: 0 bytes in 0 blocks.
    ==20295== Use --leak-check=full to see details of leaked memory.
    Merci pour tout :)
  • Red Rabbit said:
    @IrmatDen: tu déclares un ensemble de gros objets, qui, s'ils sont alloués sur la pile la ferait littéralement péter Si tu pouvais développer ca m'aiderais énormément :)
    Exemple très bourrin, mais typique. Imaginons une structure représentant un point dans un espace:
    struct Vertex
    {
    unsigned long int id;
    float x;
    float y;
    float z;
    }
    Essaie d'en instancier un tableau de 50x2000 éléments, tu verras la tronche que tire le compilo (oui, ça plante à la plante à la compil). Sans compter que toute variable non-dynamique occupe une place sur la pile, c'est à dire, dans l'exe. Au plus tu as d'éléments non-dynamique, au plus ton executable grossi. Du moins sur Windows, je ne connais pas le format d'executable des unixoides.
    Red Rabbit said:
    @nikikko: pouvoir partager les données sans faire de recopié Parles tu de la mémoire ? Est-ce que dans une class une variable "globale" est (re-)copiée pour chaque fonction membre qui l'utilise ?
    Oula, heureusement que non :)
    C'est juste que tu peux partager des données *entre* les classes sans les copier. Et pour le faire sans risque, faut se servir des smart pointers.
    Red Rabbit said:
    Pour ce qui est du polymorphisme, le PHP est type-free donc :P Et je n'ai pas encore eu l'occasion de m'enfoncer dans ce sujet (one day ... maybe).
    Oui, le php est non typé et c'est bien ça son problème, entre autres en fait... (attention, un troll se déguise agilement dans cette phrase, sauras-tu le retrouver? :D)
  • Au passage j'utilise un garbage collector avec mon appli QT sans trop de pb
    Je donne le lien a tout hasard http://www.hpl.hp.com/personal/Hans_Boehm/gc/
    Je tenterais a l'occasion d'ecrire un doc sur les deux trois pieges a eviter avec ce gc.

    Ludo
  • Merci pour l'exemple, je comprends déjà un peu mieux :) (bien que faire des tableaux x³ 50x2000 ne m'arrive pas tous les jours).
    IrmatDen said:
    Oui, le php est non typé et c'est bien ça son problème, entre autres en fait... (attention, un troll se déguise agilement dans cette phrase, sauras-tu le retrouver? :D)
    Je ne dirais plus que Fast and dirty ... take it easy :)
    IrmatDen said:
    [quote=Rabbit]@nikikko: pouvoir partager les données sans faire de recopié Parles tu de la mémoire ? Est-ce que dans une class une variable "globale" est (re-)copiée pour chaque fonction membre qui l'utilise ?
    Oula, heureusement que non :)[/quote]
    *soulagement*
Connectez-vous ou Inscrivez-vous pour répondre.