2015-10-24 1 views
2

Je réalise que cette question a été soulevée à quelques reprises, mais j'essaie d'obtenir une réponse définitive à la question ci-dessus, mais je continue à venir à travers des informations contradictoires. Ce que je dois savoir, c'est si un objet de classe de base est détruit quand j'utilise exit(). Je suis conscient de la mémoire dynamique besoin d'être supprimé, mais je sens quelque chose comme:Les destructeurs d'objets de base sont-ils appelés en sortie()?

#include <iostream> 
#include <string> 
#include <stdlib.h> 
using namespace std; 

class employee 
{ 
    public: 
     employee(); 
     string name; 
     ~employee(); 
}; 

employee::employee() 
{ 
    name = "bob"; 
} 

employee::~employee() 
{ 
    cout << "Object destroyed" << endl; 
} 

int main() 
{ 
    employee emp1; 
    exit(1); 
    cout << "Hello" << endl; 
} 

Maintenant, si je retire la sortie (1) de la principale, le « objet détruit » et « Bonjour » sont imprimés comme prévu. Laissant là cependant, aucun n'est imprimé. La raison est évidente pour "Bonjour", mais j'étais sous l'impression que emp1 serait encore détruit, mais le message de destruction n'est pas montré ...

Je regardais this link et il dit que les objets statiques étaient détruits . L'objet ci-dessus n'est-il pas considéré comme statique?

Sinon, existe-t-il un moyen de terminer un programme sans le visser avec de la mémoire? Mon projet tourne autour de l'entrée de l'utilisateur et j'essayais de donner l'option de quitter si l'utilisateur saisissait le mot 'exit'.

if(input_var == "exit") 
    { 
     cout << "You have chosen to exit the program." << endl; 
     exit(1); 
    } 

Est un exemple approximatif de ce que mon intention était.

Répondre

2

Selon this link, il ne nettoie pas l'objet. Notez que si vous utilisez la mémoire non-pile, il appellera le destructor:

static employee emp1; 

Note deuxième. Chaque fois que vous utilisez cout pour déboguer des observations de bords, synchroniser un débogage critique, etc., vous devez ajouter un cout.flush() juste après le cout pour vous assurer que votre sortie est imprimée avant de continuer. J'ai vu beaucoup de gens utiliser cout pour le débogage des plantages et la sortie ne s'imprime jamais parce que le programme se termine avant que le système d'exploitation ait une chance d'imprimer la sortie.

+0

Alors serait-il faisable de créer statiquement mes objets créés par l'utilisateur, afin que exit les détruise? Une fois l'objet créé, la seule chose qui peut être faite est la suppression, donc aucune valeur n'est disponible pour changer. –

+1

Oui, c'est une option. Vous remarquerez que si vous mettez un static devant la déclaration, le constructeur est appelé même si exit() est appelé. – jaybers

1

Votre variable emp1 est allouée sur la pile. exit ne détruit pas les variables basées sur la pile locale.

+0

Alors, y a-t-il un moyen de rendre l'option de sortie hors programme en toute sécurité? Je peux créer une fonction de sortie qui détruit les objets dynamiques, car il y a un nombre défini de ceux créés, mais cela ne marchera toujours pas pour mes objets non-dynamiques car leur nombre dépend du nombre d'utilisateurs. –

+1

Retournez la chaîne d'appel à main, ou lancez une exception interceptée dans main. La gestion des exceptions nettoiera tous les habitants. – 1201ProgramAlarm

+0

J'ai d'abord essayé une chaîne de retour, mais bon sang, c'était l'enfer pour essayer et gérer. Il y a une autre réponse qui mentionne aussi une exception, alors je vais essayer, merci. –

1

Vous pouvez lancer. Une exception nettoiera la portée déroulée.

//... 
int main() 
{ 
    try{ 
    employee emp1; 
    throw 1; //fake; throwing an object is more advisable in real situations 
    cout << "Hello" << endl; 
    }catch(int){ 
    exit(1); //or better simply `return 1;` 
    } 
} 

Sorties:

Object destroyed 
+0

Je vais devoir rechercher quelques-unes de ces choses. Mon projet actuel comporte plusieurs couches de fonctions profondes, qui demandent toutes une contribution, alors cette idée serait-elle pratique à travailler à n'importe quelle étape? Peut-être comme une fonction de lancement/sortie généralisée qui peut être appelée si elle entre en sortie? –

+1

Les exceptions tirent sur autant de couches que nécessaire jusqu'à ce qu'elles soient capturées. Et il est généralement conseillé d'avoir un bloc 'try {} catch {}' dans votre fonction 'main' de toute façon. Il pourrait aussi bien avoir convertir des exceptions fatales pour retourner des valeurs et simplement 'return'. Pas besoin d'utiliser 'exit()' du tout. – PSkocik

1

Ce que je dois savoir est si un objet de classe de base est DESTRUCTED quand je sortie d'utilisation().

Vous avez démontré que ce n'est pas le cas. Le service "exit" fonctionne sans soucis de problèmes de code. Notez que la sortie existait avant C++. Y at-il un moyen de terminer un programme sans visser avec mémoire?

Vous avez démontré que exit est au moins un moyen de terminer le programme sans appeler un destructeur C++. exit est un langage agnositique

a) Cela signifie que la mémoire ne sera pas modifiée par le destructeur.

Alors la mémoire est-elle vissée avec?

b) Une partie du traitement de sortie (et de retour principal) est que toutes les ressources mémoire de ce processus seront récupérées par le système d'exploitation. La mémoire ne sera pas "vissée" avec, (pas de destructeur appelé, pas de 'effacement' ou 'effacement').

c) Une partie de la sortie consiste à fermer tous les flux ouverts par ce processus. (Fichiers, périphériques, terminaux, etc.)

Si b) ou c) modifiez la mémoire, vous ne pouvez pas le dire, car les modifications n'ont plus d'association avec le processus fermé.

+0

Désolé, mon sens d'être foutu était un peu flou. Je voulais dire dans le sens que la mémoire utilisée n'est pas libérée en appelant des destructeurs lorsqu'une situation de sortie se produit. –

+0

@DwayneH Si vous quittez, la mémoire est toujours (forcée) libérée, sauf si vous êtes sur un système d'exploitation très foireux. – PSkocik

+0

Eh bien, nous utilisons Linux à l'université, mais je ne sais pas si se fier à cela est une mauvaise idée. Puisque nous sommes classés sur un tas de choses, y compris la gestion de la mémoire, il pourrait être plus sûr d'essayer l'une des autres options pour les garder heureux. –