C ++ - fonction qui retourne l'objet
//Assume class definition for Cat is here.
Cat makeCat() {
Cat lady = new Cat("fluffy");
return lady;
}
int main (...) {
Cat molly = makeCat();
molly->eatFood();
return 0;
}
Aura-t-il un "utiliser après" erreur sur molly->eatFood()
?
source d'informationauteur Kevin Meredith
Vous devez vous connecter pour publier un commentaire.
Corrigé votre programme et créé un exemple de mise en œuvre de
class Cat
:Il va produire de la sortie:
Je vous suggérons d'en apprendre d'un livre de base sur le C++ d'un couvert à l'avant de continuer.
new Cat("fluffy")
crée un pointeur. Vous aurez besoin de spécifierCat*
comme type de retour. Depuis la création de l'objet dans le tas, il sera toujours disponible après la fonction renvoyée.Il n'y a pas d'erreur aussi loin que l'utilisation incorrecte de la mémoire d'autre qu'une fuite de mémoire à la fin de votre programme. Si quelque chose est créé sur le tas (comme avec
new
), alors vous avez besoin d'appelerdelete
sur il gratuit.Vous avez aussi beaucoup d'erreurs de syntaxe, corrigée ci-dessous.
Depuis
lady
est créé sur le tas (avec unnew
), il ne sera pas supprimé lorsque vous quittez lemakeCat
méthode. Donc, l'appel surmolly
est parfaitement valide.MAIS, vous avez une fuite de mémoire. Vous devez supprimer
molly
après l'utilisation (dans le futur.) Depuis la fin de votre programme, ce n'est pas une grosse affaire. Dans un programme plus large, ce serait une très grosse affaire.Le problème n'est pas une "Utilisation après Libre"; plus probablement que vous n'êtes pas supprimer-tion de la nouvelle instance.
Je pense qu'il devrait être
Cat *lady
etCat *molly
mais dans le cas contraire, il devrait être ok.Si votre compilateur prend en charge le c++11, vous pouvez utiliser unique_ptr ici:
Maintenant, vous n'avez pas à vous soucier de la suppression d'objet créé. Il sera supprimé dès que molly pointeur est hors de portée: