-1
votes

Réutiliser un pointeur de double tableau sans fuite de mémoire en C ++ via "Supprimer" bloque le programme

J'ai essayé la convention (un peu discutable) de Supprimer 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 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 Supprimer , le programme s'exécute parfaitement.

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 () Fonction et à l'aide de la classe QuickSort Classe et ses pointeurs, etc.

Les seules choses que je peux changer sont les choses qui vont dans les différents fonctionne, et bien qu'il semble que défini (double *, int) peut simplement être intégré au constructeur, ce n'est pas une option possible ici pour une raison quelconque.

L'objectif est Pour définir un par défaut, double * dans le constructeur, puis supprimez-le et copiez-la INPUT_ARRAY dans this-> Art Dans Ensemble :

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.

main.cpp xxx

trier.hpp < / code> xxx


13 commentaires

Pourquoi Quick_sort 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 (); Vous ne devez pas affecter de manière dynamique votre objet QuickSort.


La convention est plutôt d'utiliser no Supprimer 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 ++ 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 ...


3 Réponses :


2
votes

La première ligne de QuickSort :: Ensemble Code>:

delete[] arr;
this->arr = new double[size]; // Make new array of `size` size


6 commentaires

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 [] 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.



2
votes

Un aspect rapide révèle que vous utilisez Supprimer au lieu de Suppr [] ..

Cette ligne:

Supprimer ceci-> Art; // Supprimer la matrice dans l'objet de cette classe

devrait être:

Supprimer [] this-> Art; // Supprimer la matrice dans l'objet de cette classe

En outre, conformément à la Convention de Supprimer, vous devez également le faire:

Supprimer [] this-> Art;
this-> arr = nullptr; // Ceci est important, sinon votre double suppression qui appelle des problèmes.



3
votes

Dans votre Constructeur QuickSort Vous écrivez en dehors des limites de la matrice que vous allociez: xxx

dans la première itération i est 0 donc this-> arr [i-1] écrit à l'élément -1 . Ceci n'écrase que lorsque vous appelez Supprimer comme si vous ne le faites pas que l'exécution ne remarque pas cette corruption et quitte proprement.

vraisemblablement changer i-1 < / code> à i produira le comportement souhaité.


1 commentaires

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"