J'ai essayé la convention (un peu discutable) de La MWE mesure du temps pour un simple algorithme de tri rapide, et comme il s'agit d'un projet scolaire, je ne peux pas changer le < Code> Main () Code> Fonction et à l'aide de la classe Code> QuickSort Code> Classe et ses pointeurs, etc. P> Les seules choses que je peux changer sont les choses qui vont dans les différents fonctionne, et bien qu'il semble que L'objectif est Pour définir un Edit: J'utilise Windows 10 et le compilateur GCC C ++ de Mingw-W64. Toutes les compilations ont été exécutées dans l'invite de commande Windows. P> Supprimer code> après utilisation, mais cela ne semble pas fonctionner. Le programme est censé recevoir une entrée d'un seul entier, trier un tableau créé aléatoirement et l'impression de temps écoulé pour le tri, mais lorsque je quitte le Supprimer code> là-bas, le programme se termine anormalement sans un avertissement après que je faisais l'entrée. En d'autres termes, il se bloque. Cependant, lorsque je commencez simplement la ligne code> Supprimer code>, le programme s'exécute parfaitement. défini (double *, int) code> peut simplement être intégré au constructeur, ce n'est pas une option possible ici pour une raison quelconque. p> par défaut, double * code> dans le constructeur, puis supprimez-le et copiez-la INPUT_ARRAY CODE> dans this-> Art code> Dans Ensemble Code>: P> main.cpp code> p> trier.hpp < / code> p>
3 Réponses :
La première ligne de QuickSort :: Ensemble Code>: delete[] arr;
this->arr = new double[size]; // Make new array of `size` size
Je viens d'essayer cette solution aussi, mais le programme ne fonctionne toujours pas. Il n'y a pas de sortie produite.
Vous devez modifier votre question pour inclure plus d'informations sur votre problème. Cela évite la fuite de mémoire évidente, car c'est ce que le titre de la question pose.
Je ne sais pas quels autres détails je peux fournir; Il suffit de commenter la ligne Suppr [] code> fonctionne vraiment, comme dans le tri et le temps de mesure.
@ K.paul peut-être Eric Lippert's Comment déboguer de petits programmes < / a> Article vous aidera à vous aider.
Je considérerais que c'est plutôt un commentaire qu'une réponse; Une fuite de mémoire ne provoquera pas de crash d'un programme - à moins que nous ayons divulgué que beaucoup de mémoire que OS ne puisse nous fournir plus, mais je doute à peu près que nous avons eu à ce stade. Toujours une bonne prise.
@Aconcagua La question initiale n'a pas mentionné un crash. Cela n'a évoqué qu'une fuite de mémoire, alors j'ai répondu à ce sens.
Un aspect rapide révèle que vous utilisez Cette ligne: p>
Supprimer ceci-> Art; // Supprimer la matrice dans l'objet de cette classe p>
blockQuote>
devrait être: p>
Supprimer [] this-> Art; // Supprimer la matrice dans l'objet de cette classe p>
blockQuote>
En outre, conformément à la Convention de Supprimer, vous devez également le faire: P>
Supprimer [] this-> Art; Supprimer code> au lieu de Suppr [] code> .. p>
this-> arr = nullptr; // Ceci est important, sinon votre double suppression qui appelle des problèmes. P>
blockQuote>
J'ai essayé ça aussi, mais le problème ne fonctionne pas même avec ce changement.
@ K.paul pouvez-vous définir "ne fonctionne pas"? Qu'est-ce qui échoue exactement? Avez-vous la mauvaise sortie? Est-ce que ça tombe?
Crashes, releva exactement des symptômes comme avant: Aucune sortie produite.
Fonctionne après le this-> arr = nullptr code>! Merci.
Non ... Désolé, fausse alarme, j'ai réessayé et cela produit toujours le même problème.
this-> arr = nullptr code> dans un Destructor i> est totalement obsolète, comme arr compte code> (ici!) est un pointeur ordinaire, pas un pointeur intelligent. Donc, il n'y aura pas de double suppression non plus, et la variable fonctionne de la portée après la sortie du destructeur de toute façon.
@Aconcagua tu es correct. J'ai raté son intérieur un destructeur. Je parlais plus en termes de convention de Supprimer, il parlait de.
@ K.paul, enfin pour sauver le temps de tout le monde, j'ai essayé de l'exécuter sur ma boîte. Il court sans accidents. Pouvez-vous spécifier le système d'exploitation / compilateur que vous utilisez ... et veuillez fournir un code pour fonctionner check_quick code>
Ok .. Je n'ai pas l'environnement que vous courez. Mais j'ai légèrement formaté le code pour vous, il est donc plus facile de déboguer. Voici le code Pastebin.com/2WL54Z3F
Dans votre dans la première itération vraisemblablement changer Constructeur QuickSort Code> Vous écrivez en dehors des limites de la matrice que vous allociez: i code > est 0 code> donc this-> arr [i-1] code> écrit à l'élément -1 code>. Ceci n'écrase que lorsque vous appelez Supprimer code> comme si vous ne le faites pas que l'exécution ne remarque pas cette corruption et quitte proprement. P> i-1 < / code> à i code> produira le comportement souhaité. p> p>
M'a pris des âges pour le trouver aussi, juste après que je l'ai trouvé, j'ai remarqué la nouvelle ligne verte Squiggly à VS 2019, ce qui a déclaré "l'indice de tableau est -1"
Pourquoi
Quick_sort code> doit-il être attribué de manière dynamique? Ou un pointeur du tout à ce sujet? Nommer également un paramètre dans une fonction de membre identique à celle d'une variable de membre demande des problèmes.Note latérale: Chaque fois que vous n'êtes plus lié par des restrictions de professeurs stupides, utilisez simplement une PTR unique au lieu de points nus ou de vecteur STD pour des tableaux dynamiques alloués.
Quicksort * Quick_sort = Nouveau QuickSort (); Code> Vous ne devez pas affecter de manière dynamique votre objet QuickSort.La convention est plutôt d'utiliser no
Supprimer code> du tout, du moins pas directement@ SCOHE001 "lié par des professeurs stupides ..." et franchement, aucun des étudiants ne comprend que le besoin d'être un pointeur du tout.
Moderne
c ++ code> supprime le besoin de gestion de la mémoire manuelle.@SombreroChicken pourquoi l'attendre jusqu'à ce qu'il soit trop tard? Écrire votre propre version simple d'un pointeur intelligent n'est pas trop difficile et devrait être un numéro de cours zéro au lieu de cela "Vous devez utiliser des pointeurs bruts afin de l'apprendre de manière difficile" non-sens
@Drescherjm serait une allocation dynamique crée des complications?
@ user463035818 hm, peut-être que je devrais changer cela, devinez-le reflétant la "perception du professeur de" la convention ...
Cela rend le problème plus difficile que nécessaire et décourage de nouvelles personnes à la langue en raison de la complexité inutile enseignée au mauvais moment. Il y a une très bonne conférence de YouTube / Talk sur le sujet. Bien que je n'ai pas de lien.
@ user463035818 Très vrai, c'est une autre bonne option. J'en ai tellement fini avec les universités enseignant aux étudiants C au lieu de C ++.
@Drescherjm vous voulez probablement dire YouTu.be/ynwhqhnyyk
À propos de Utilisation de Namespace Std ...