2017-09-20 3 views
0

Pour répondre à ma question, j'ai effectué quelques tests:Est-ce que std :: quitte la mémoire de fuite?

(pour reproduire ci-dessous comprend sont nécessaires)

#include <cstdlib> 
#include <memory> 

J'ai fait une fonction qui a appelé std::exit, avec un std::unique_ptr dans la fonction main.

void some_function() 
{ 
    std::exit(EXIT_SUCCESS); 
} 

int main() 
{ 
    std::unique_ptr<int> relying_on_raii{new int{5}}; 
} 

Si j'ai appelé some_function après la déclaration unique_ptr, la mémoire pourrait fuir.

Les deux journaux je suis arrivé de Dr. Memory différé dans la ligne suivante:

1 potential leak(s) (suspected false positives) 
     […] 
    6 unique,  6 total, 797 byte(s) of still-reachable allocation(s) 

contre

1 potential leak(s) (suspected false positives) 
     […] 
    7 unique,  7 total, 801 byte(s) of still-reachable allocation(s) 

Comme on le voit, dans le second exemple une fuite potentielle 7 est survenue, qui a été 4 octets en taille, qui est exactement la taille d'un int. Quand j'ai répété ce test avec double, il s'est avéré être 805 byte(s) dans le test avec std::exit.

Est-ce que std::exit est une fonction sûre à utiliser, ou devriez-vous toujours revenir de l'alimentation principale pour éviter les fuites de mémoire?

+0

Si vous appelez 'sortie', une fuite est-elle toujours une préoccupation majeure? Si vous voulez que la pile soit déroulée. Jetez une exception que seul 'main' peut attraper. – StoryTeller

+0

@StoryTeller Je veux utiliser std :: exit comme la manière habituelle de quitter mon programme, puisque je devrais appeler return 3 fois, avec une vérification de la valeur de bool, si on doit rétrograder et cela semble plus facile à faire avec 'std: : sortie'. 'throw' est une idée intéressante, mais il semble que ce soit un hack pour lancer une sortie réussie – kim366

+0

Si le programme est quitté, qu'est-ce qu'il y a de fuite? L'OS nettoiera le processus. – NathanOliver

Répondre

1

Donc, std :: exit est-il une fonction sûre à utiliser, ou devriez-vous toujours revenir de la partie principale pour éviter les fuites de mémoire?

Oui, il peut y avoir une fuite de mémoire.

C'est le problème le moins inquiétant. Le problème le plus important sera si votre programme a acquis des ressources qui n'ont pas pu être libérées en arrêtant le processus. Pour gérer de tels cas, il est préférable de revenir avec un état d'erreur jusqu'à ce que vous soyez en mesure de quitter main ou d'utiliser try-throw-catch pour vous assurer que main est capable d'attraper toutes les exceptions non interceptées et de quitter gracieusement.