1
votes

Comment effacer la mémoire allouée dynamiquement à l'aide de l'opérateur delete []? (Impossible d'effacer avec la syntaxe de suppression normale)

J'ai alloué une mémoire dynamique en utilisant int * p = new int [size]; Maintenant, lorsque j'essaye de le supprimer en utilisant delete [] p; J'obtiens une erreur de segmentation (vidage de mémoire) lors de l'exécution du code.

Au départ, j'ai pu entrer des éléments de tableau de manière dynamique et cela fonctionnait normalement. Mais, après avoir exécuté un certain nombre de fois, maintenant il dit défaut de segmentation. J'ai une fonction où j'ai alloué de la mémoire en utilisant new plus tard à la fin de la portée de cette fonction, j'ai inclus delete [] p. Suis-je censé inclure la suppression dans la fonction principale?

number of variables:  4
enter number of minterms:  8
enter the minterms in decimal: 1
enter the minterms in decimal: 2
enter the minterms in decimal: 3
enter the minterms in decimal: 4
enter the minterms in decimal: 5
enter the minterms in decimal: 6
enter the minterms in decimal: 7
enter the minterms in decimal: 8
1 2 3 4 5 6 7 8 successfully deallocated00000000119614428832765154679997521907-10100852163265911961440643276540008000800080004000-1005...<a lot of numbers>...07370419492536907748609097595Segmentation fault (core dumped)

#include<iostream>
using namespace std;

void input(){
    int n,d, i= 0, count;
    cout<< "number of variables: "<<" ";
    cin>>n;
    cout<<"enter number of minterms: "<<" ";
    cin>>count;
    int x =  pow(2, n);

    int *p = new int[count] ; //dynamic allocation

    for(i = 0; i<count; i++)
    {   
        cout<< "enter the minterms in decimal: ";
        cin>>d;    
        p[i] = d;
    }

    for( i =0; i< count; i++){
        cout<<p[i]<<" ";
    }

    delete [] p; //(Do I need  to write delete over here or in the main                           
    //func, Right now I've used it here(i.e,the user defined function.)
    cout<<"successfully deallocated";
}

//Main function:
int main(){

    int *p = NULL; //Is this required ?


    input();
    //delete[] p; (Do I need to mention delete over here?)
    return 0;
}


2 commentaires

1. Évitez si vous le pouvez le texte de sortie volumineux dans les questions. 2. Vous utilisez C ++ comme C. Utilisez des pointeurs intelligents, utilisez nullptr au lieu de NULL


Il n'y a rien dans votre code qui pourrait produire cette sortie.


3 Réponses :


0
votes

J'ai testé votre code et pour moi, il fonctionne sans problème.

Si vous allouez de l'espace dans main (), vous devriez aussi généralement le désallouer également dans main ().


0 commentaires

0
votes

Le pointeur p que vous créez en entrée est indépendant du pointeur que vous créez dans le main. Vous ne pouvez donc pas accéder au tableau que vous créez en entrée lorsque vous êtes de retour dans main.

Si c'est ce que vous voulez faire, vous "ne pouvez" pas supprimer p dans l'entrée, le retourner à main, l'utiliser dans main, puis le supprimer dans main. Cependant, séparer le nouveau et le supprimer de cette manière n'est pas la meilleure pratique de codage.

Si vous ne souhaitez pas utiliser le tableau dans main, vous devez supprimer toute référence à p dans la fonction main, pas besoin de le définir sur null, et certainement pas de le supprimer.


0 commentaires

1
votes

Ce code fonctionne très bien sous clang, g ++ et vc ++. Exemple: https://rextester.com/PBN39654

Cela me fait penser qu'il y a soit quelque chose qui ne va pas avec votre environnement lorsque vous construisez le code, soit quelque chose d'autre déclenche le vidage de mémoire après le retour de main. Comment construisez-vous cette démo?

Il y a cependant des choses que vous pouvez améliorer. Par exemple:

  • N'utilisez pas DMA manuellement ... Essayez de favoriser un std::vector
  • Initialisez toujours vos variables. Les variables locales (étendues) non-statiques non initialisées telles que vos n, d et count recevront des valeurs inutiles.
  • x n'est utilisé nulle part. Supprimez-le.
  • int * p = NULL a quelques défauts, l'un d'eux étant NULL . NULL est une macro à 0 . Si vous souhaitez créer un pointeur qui ne pointe vers rien, utilisez nullptr . Deuxièmement, int * p n'a rien à voir avec le pointeur de la fonction, il est donc inutile. Retirez-le.

Voici une démonstration de l'exemple mis à jour: https://rextester.com/BUTV13117


0 commentaires