2011-08-29 5 views
1

je la méthode suivante:try {} catch() {} C++

class MyClass 
{ 
public: 
    MyClass; 

    bool method (MyClass &obj); 
}; 

void MyClass::method (MyClass &obj) 
{ 
    MyClass *c = new MyClass; 
    try{ 
     //code 
     //access another method 
     return true; 
    } 
    catch (std::string s) 
    { 
    } 
    return false; 
} 

Où dois-je supprimer le pointeur c à l'objet de MyClass: avant return true ou avant return false?

+2

cette question n'a aucun sens. veuillez clarifier pourquoi vous créez l'objet 'c'. Quelle est sa durée de vie? avez-vous besoin d'un pointeur? –

+0

Aussi, corrigez le code qui est posté, le code actuel n'a pas vraiment de sens: le 'MyClass;' dans la portée de classe n'a pas de sens, il y a un ';' manquant après la définition de classe, la sémantique de ce que vous intention de faire ne sont pas claires ... –

+0

duplication possible de [Comment libérer de la mémoire dans les blocs try-catch?] (http://stackoverflow.com/questions/3048377/how-to-free-memory-in-try- catch-blocks) – razlebe

Répondre

10

Qu'en est-:

void MyClass::method (MyClass &obj) 
{ 
    MyClass c; 
    try{ 

     //code 
     //access another method 
     return true; 
    } 
    catch (std::string s) 
    { 
    } 
    return false; 
} 

Pas new -> pas delete nécessaire. c est automatiquement détruit lorsque method retourne. Si votre exemple est trop simplifié et que vous devez créer c avec new, vous devez suivre les autres réponses avec les suggestions de pointeur intelligent.

9

Vous devez utiliser une forme de RAII, Vous n'avez donc pas à vous préoccuper de la suppression de l'objet vous-même. En utilisant RAII, l'objet lui-même prend soin de libérer les ressources qu'il a acquises, et vous n'avez pas besoin de le faire vous-même.

L'une des manières les plus simples d'implémenter RAII est l'utilisation de Smart pointers.
Vous pouvez utiliser unique_ptr.

+4

Je suis assez sûr que c'est chinois à l'OP –

+0

@yi_H: J'ai lié, * Quelle est la question RAII? * dans la réponse, cela explique cela en détail. –

+2

Bien sûr, dans cette situation, il serait probablement préférable de simplement allouer en pile l'instance de 'MyClass'. – Mankarse

3

La réponse simple est que vous devez utiliser un pointeur intelligent pour gérer la mémoire (le choix du pointeur intelligent dépend du reste du code), ce qui simplifiera votre code. Comme il est, vous devrez delete dans tous les chemins de code qui quittent le contexte, qui comprend les deux retours et éventuellement toute autre exception levée.

3
 
std::auto_ptr<MyClass> c(new MyClass); 
+2

'std :: unique_ptr' serait plus approprié dans cette situation, car' c' ne va nulle part. L'utilisation de 'unique_ptr' indique plus clairement l'intention du code et sera probablement plus efficace. – Mankarse

+1

Parfois, je pense que je devrais downvote chaque réponse qui, sans aucune autre explication ou règle, ou la pleine connaissance du problème sauter dans 'shared_ptr'. 'shared_ptr' est l'un des pointeurs intelligents les plus restrictifs du langage, une fois qu'il revendique la propriété d'une ressource, il ne peut pas le céder, ce qui signifie que si' // code' transmet la propriété du pointeur à une autre fonction, 'shared_ptr' encore le supprimer, ou vous serez forcé (si vous le pouvez) de changer l'interface de cette autre fonction ... @Mankarse a raison: 'unique_ptr' ou même bon vieux' auto_ptr' sont de meilleurs choix par défaut. –

+0

@David Rodríguez - J'ai utilisé shared_ptr pour la compatibilité avec les anciens compilateurs - tous les compilateurs ne supportent pas C++ 0x. Dans le contexte de cette question, il n'y a pas de problème de propriété. Pour C++ 0x unique_ptr est la réponse. –

0

Vous pouvez créer une variable en dehors de try and catch, la définir par défaut sur false, au lieu de retourner true true. Et au lieu du retour false renvoyer la variable.

Vous pouvez ensuite supprimer votre instance juste avant de renvoyer cette variable.

+0

où exactement? Il est préférable de créer l'instance de myClass à l'intérieur essayer? Pourriez-vous s'il vous plaît poster votre idée? Thx – sunset