toujours dans le cadre du projet Navigo que je suis en train de terminer, j'ai un bouton dans ma barre d'outils. Quand j'appuie dessus, alors la liste des favoris enregistrés dans un fichier .ini grâce à un QSettings, doit s'afficher.
J'ai utilisé les lambda fonctions enseignées par gbdivers et j'ai omis de mettre les tests de pointeurs (pour le code propre)
Voici une partie des messages que j'obtiens :
Impossible d'obtenir la sortie du débogage.
Le programme s'est terminé subitement.
Et voici le code du public slot qui s'en charge (appremment, il y a un bug donc) :
Vérifier les pointeurs n'est pas un question de proprete du code. C'est indispensable pour minimiser les problèmes avec les pointeurs. Si tu regles pas un problème aussi important, on ne va pas s'embeter avec les details.
Est-ce que à la sortie d'une lambda fonction, les pointeurs déclarés dans la lambda fonction, sont détruits lorsque l'on sort de cette lambda fonction ?
Pour le addTab, j'en ai besoin pour ajouter un nouvel onglet quand je clique sur un QCheckBox de la liste des favoris.
- Edité par pseudo-simple 9 septembre 2017 à 17:31:44
> Est-ce que à la sortie d'une lambda fonction, les pointeurs déclarés dans la lambda fonction, sont détruits lorsque l'on sort de cette lambda fonction ?
les pointeurs déclarés dans une fonction sont-ils détruits lorsque l'on sort de cette fonction ?
C'est pareil avec les lambdas.
Après, je suis persuadé que la question est mal posée puisque toutes variables déclarées dans un scope sont détruites à la fin de celui-ci. Il faudrait plutôt demander: "Toutes les variables allouer dynamiquement sont-elles détruites ?".
Et la réponse est non. C'est pour cela qu'on a les pointeurs intelligents et Qt un système de parent/enfant.
je pense que ton soucis viens de ton mode de capture, tu captures tout par valeur, alors que tu souhaites agir sur l'instance actuelle, tu devrais donc capturer par référence, voire tu n'as besoin que de this (si urlDefault est une variable membre comme je le suppose)
Dream on, Dream on, Dream until your dream comes true
Justement, tu n'as pas capturé par référence mais par valeur dans tes fonctions lambda
[a,&b](params){expression} // spécifie exclusivement la capture de a par valeur et b par référence
[this](params){expression} // capture l'instance *this par référence
[&](params){expression} // capture toutes les variables par référence
[=](params){expression} // capture toutes les variables par valeur (copie) dont this (donc capture de *this par référence)
[](params){expression} // ne capture rien
Le soucis, c'est qu'en capturant par valeur, tu effectue une copie locale à ta fonction lambda de toutes les variables (à portée automatique), donc lorsque tu fais une opération sur une variable, tu la fais sur une copie et pas sur l'originale.
Or les opérations que tu cherches à réaliser ici sont à effectuer sur this, l'instance sur laquelle cette fonction va être appelée
En tout cas y'a du progrès ! Enfin une joli syntaxe de connect, des déclarations auto+initialisation là où ça s'y prête bien ... c'est cool
Il manque le parent à page pour gérer la mémoire correctement et cette mécompréhension des portées/visibilités vis-à-vis des lambda mais sinon c'est pas mal.
Reste aussi à savoir si conceptuellement, l'utilisation d'une lambda est justifiée ici, est-ce que la fenêtre ne devrait pas proposé une fonction void ouvrirOnglet(QString url) ?
- Edité par romantik 15 septembre 2017 à 8:36:54
Dream on, Dream on, Dream until your dream comes true
Merci pour les encouragements pour les progrès effectués.
Pour l'état actuel du code, voici ce que j'ai fait en fonction de ce que tu conseilles (j'ai passé l'esperluette) à la place du = dans la fonction lamba
Il va falloir s'en sortir avec le débogueur pour pouvoir situer le soucis, ou bien trouver le code minimal pour pouvoir le reproduire
Dream on, Dream on, Dream until your dream comes true
Affichage de a liste des favoris(public slot)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Discord NaN. Mon site.
Discord NaN. Mon site.