|
Bas de page | |
---|---|
Auteur | Sujet : Cas où les références remplacent mal les pointeurs ? |
NounouRs Non parce que c pas mon pied ! | Bonjour,
Message cité 2 fois Message édité par NounouRs le 01-10-2009 à 11:11:29 |
Publicité | Posté le 01-10-2009 à 11:09:59 |
Joel F Real men use unique_ptr | je vois pas le pb ... donne splsu de details sur les type etc la je comprends rien. |
Joel F Real men use unique_ptr | File c'ets quoi ?
|
Xavier_OM Monarchiste régicide (fr quoi) | Je peux me tromper, mais selon moi ça donne ça : Une référence ne peut pas être nulle, donc ton membre de classe m_pFile qui est nul, puis non nul une fois passé dans ta méthode de loading (ou ton ctor si tu es plus dans le style RAII), puis re nul une fois passé dans ta méthode d'unloading (ou ton destructor si RAII) ça doit être un pointeur je pense. Par contre faut utiliser les références dès que tu veux passer un objet à une fonction (et pas une copie), plutôt que de prendre un pointeur sur l'objet (et de passer une copie du pointeur du coup, C style). Enfin t'as les auto_ptr aussi, cf. l'exemple de la faq de B. Stroustrup :
Je dis ptet de la merde hein, faut attendre confirmation de Joel F edit : ton exemple rappelle un peu http://www.research.att.com/~bs/bs_faq2.html#finally Message édité par Xavier_OM le 01-10-2009 à 12:14:51 --------------- Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire. |
Joel F Real men use unique_ptr | boost::unique_ptr et ca sera parfait |
NounouRs Non parce que c pas mon pied ! | L'approche RAII a l'air d'etre beaucoup plus adapté à une approche "throw d'exceptions".
Message édité par NounouRs le 02-10-2009 à 14:22:21 |
Joel F Real men use unique_ptr | auto_ptr a une semantique moisie |
jesus_christ votre nouveau dieu | un peu HS, mais
|
Lavock |
|
Publicité | Posté le 12-10-2009 à 16:21:32 |
Joel F Real men use unique_ptr |
|
Polo37 | Dans son exemple, on peut au final très bien utiliser une référence tout en vérifiant le nom du fichier:
|
Lavock |
|
Polo37 | ouais j'avoue avoir bien loosé sur ma réponse... |
Lavock | Oui, je case aussi la sécurité dans la partie lazy tweak. Après, je dis pas qu'il sont inutile, j'en utilise tout plein. Et puis effectivement, ça fait pas de mal de ne pas pensez à la sécurité des pointeurs (généralement, on a d'autre chat à fouetter).
|
Un Programmeur |
--------------- The truth is rarely pure and never simple (Oscar Wilde) |
Lavock |
|
Un Programmeur | Il faut au moins un parametre qui soit une classe, une reference vers une classe, une enumeration ou une reference vers une enumeration. --------------- The truth is rarely pure and never simple (Oscar Wilde) |
Joel F Real men use unique_ptr |
|
Un Programmeur |
--------------- The truth is rarely pure and never simple (Oscar Wilde) |
Lavock | Ca plus le fait qu'on ne peut pas appeler un constructeur non-recopiant.
|
Joel F Real men use unique_ptr | Il faut que m_file est un constrcteur avec rvalue-ref Message édité par Joel F le 13-10-2009 à 18:10:14 |
Lavock | En gros, ça en revient à ça :
|
Joel F Real men use unique_ptr | le new est inutile, renvoit un object creer sur la pile. Message édité par Joel F le 14-10-2009 à 12:14:10 |
Un Programmeur | Pire, avec ce code le delete n'est jamais fait. --------------- The truth is rarely pure and never simple (Oscar Wilde) |
Lavock | Bon, pour recentrer, et pour résumer, après avoir fais joue-joue avec les rval, lval, et autres mov (NounouRs, ta participation est sollicitée): Conseil -> n'utilise n'y pointeur, ni ref. Si tu veux vraiment utiliser une ref ( l/rvalue ref en c++0x) --> tu dois faire comme je l'ai précisé plus haut. Si jamais, malheur t'en prend, tu fais comme dans l'exemple suivant :
Sache que les appels s'enchaînent comme ceci : Constructeur de A, Destructeur de A, Constructeur de B. (Au passage, oui un move constructor et un move on était défini pour A). Il n'y a pas de présence du move constructor à l'endroit voulu (juste avant le destructeur). Du coup, gare aux erreurs ! La seule question qui reste suspendue à nos méninges; c'est pourquoi, oui mais pourquoi, ne peut t'on appeler un move constructor sur une ref(l ou r), et ce, même en la forçant (exemple ci-dessus) ? La réponse, bien que simple, n'est pas forcément instinctive. Juste que lors de l'initialisation d'une ref, aucun constructeur n'est appelé. D'où l'inutilité de l'opérateur move. Du coup, je pense que le "discours" tenu entre M. l'illustre (sincèrement) Joel F. et moi-même n'était que quiproquo... Ou alors, j'ai rien compris ! Note : * Pour ceux qui ne savent pas, on peut initialiser une lvalue ref qu'avec une lvalue. Donc il possible d'initialiser une lvalue ref avec une rvalue ref (qui est une lvalue). Malheureusement, l'utilisation d'une rvalue ref ne permet en rien l'extention de vie d'une variable -> Une fonction renvoyant une rvalue ref n'as pas vraiment d'utilité, et cette valeur sera d'ailleurs une rvalue (donc impossible de l'attaché à une lvalue ref). P.S : Une fonction Type&& retournant une rvalue temporaire indique un warning. Il est possible de fourbé le compilateur en mettant un
mais attention au bug du runtime ! P.P.S : Cas intéressant, changeons le code ci-dessus par :
Marche parfaitement bien ! [Edit] En revanche, cela prvoque une fuite mémoire qu'il ne sera pas évident de colmater ! [Edit] Cf. Pensée saugrenue quelques postes plus bas ! Message cité 5 fois Message édité par Lavock le 14-10-2009 à 22:46:08 |
Xavier_OM Monarchiste régicide (fr quoi) |
--------------- Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire. |
Lavock | Oui, d'où
[Edit] Et un grand merci à toi pour cette explication simple mais efficace qui m'échappait. Message édité par Lavock le 14-10-2009 à 17:45:16 |
Joel F Real men use unique_ptr |
|
Un Programmeur | Il y a de la confusion. Ou de ma part, ou de la votre. Je n'ai malheureusement pas le temps de vérifier en détail. Mais quand je lis
--------------- The truth is rarely pure and never simple (Oscar Wilde) |
Joel F Real men use unique_ptr | ce code est faux pour la simple raison qu'il leak.
|
Lavock |
Au temps pour moi ! Ca leak (et non M Joel, je sais ce qu'un programme ); et vraiment aucun moyen de libérer ce fichu pointeur...
Du coup, non, C++0x ou pas, ça change rien... une rvalue restera rvalue; sauf pour ce code alambiquer qui n'en veut pas la peine :
En tout cas, ça m'aura appris plein de chose sur ce nouveau standard, même si je ne suis pas l'auteur du sujet, et que c'était même pas le sujet... [Edit] Pensée saugrenue : on pourrait, pour colmater la brèche, adopter une convention --> le A(const A&& ) agierait normalement, mais le A(A&& ) ferait un delete de la rref passez en paramètre... Un moyen d'exploiter la const surcharge ! Mais ça oblige pas mal de formalisme. Message édité par Lavock le 14-10-2009 à 22:44:33 |
Joel F Real men use unique_ptr | le truc c'est que tu renvois ce *new A
|
Lavock |
|
Joel F Real men use unique_ptr | ce que je voulais dire c'es que vu la semantique de la rvalue copy, t'as plus besoin d'avoir une ref., tu vas stocker un insance et la move-copiée |
Lavock | Sur ça, on est d'accord; comme je le disais depuis le début, le mieux c'est de ne pas utiliser de ref, ni de pointeur.
|
Joel F Real men use unique_ptr | oui mais non a cause de la semantique lvalue/rvalue/named rvalue. |
Un Programmeur | Pour revenir au probleme initial,
--------------- The truth is rarely pure and never simple (Oscar Wilde) |
Glock 17Pro | ça donne quoi une exception dans le constructeur ? faut try-catcher la construction de l'objet ? c'est ok comme conception ? pas de problème de fuite de mémoire ? --------------- . |
Un Programmeur | Les membres déjà construits sont détruits et l'exception est propagée.
--------------- The truth is rarely pure and never simple (Oscar Wilde) |
Publicité | Posté le |
Sujets relatifs | |
---|---|
Tableau de pointeurs en c | References et objets, bonne pratique |
[résolu] parcours d'un char** sans connaitre le nombre de chaines | C++ et pointeurs, problème pour désalouer... |
soucis pointeurs | Référence ou pointeurs? |
Cas d'utilisation UML | pointeurs intelligents Boost |
Petit problème avec un hash, des tableaux et des références | Templates et pointeurs |
Plus de sujets relatifs à : Cas où les références remplacent mal les pointeurs ? |