2017-09-10 7 views
0

J'ai fait une variable de pointeur, ptr_view, dans un cpp principal pour l'allocation dynamique pour créer des vues & boutons dans l'écran. Et sch, ceci est un pointeur commun dans class_A, class_B ... pour indiquer la classe principale pour accéder à ce pointeur ptr_view. Lorsque vous appuyez sur le bouton class_A, la fonction comme ci-dessous est en cours d'exécution.allocation dynamique C++ dans cocos2d-x

void class_A::ChangeView_B() 
{ 
CC_SAFE_DELETE(sch->ptr_view); 
sch->ptr_view = new class_B; 
sch->ptr_view->RCreation(main_view); 
} 

mais cela crée évidemment une erreur, je suis enfin savoir pourquoi, depuis la mémoire de Class_A est terminée lorsque CC_SAFE_DELETE est en cours d'exécution si « sch » est plus exister en essayant d'accéder SCH> ptr_view . Mais ne savent toujours pas comment résoudre ce problème. Est-ce que quelqu'un peut me donner un petit indice pour traverser cette situation?

Répondre

0

Votre logique serait beaucoup plus facile à raisonner si vous utilisiez un type de pointeur intelligent pour gérer votre mémoire. Cocos2d-x fournit son propre type de pointeur intelligent, cocos2d::RefPtr<T>, qui est essentiellement un pointeur compté par référence (par exemple std::shared_ptr<T> ou Objective-C ARC). Cela dit, compte tenu de l'information contenue dans la question, il n'y a aucune raison que le code que vous avez posté ne fonctionne pas. CC_SAFE_DELETE(sch->ptr_view) (qui est effectivement delete ptr; ptr = nullptr;) ne doit pas supprimer sch. Il peut y avoir d'autres bogues de mémoire dans votre programme. Encore une fois: les pointeurs intelligents sont votre ami.

+0

Merci d'avoir répondu à ma question! Mais quand je supprime le code CC_SAFE_DELETE (sch-> ptr_view) et insère une nouvelle fonction comme cleanUp(), qui supprime tous les boutons et ressources que class_A a laissés dans la scène, aucune erreur ne s'est produite. J'ai également eu le débogage ceci et a trouvé la suppression ptr-> view crée l'erreur. Après ce code, "sch" renvoie null. Avez-vous d'autres idées qui peuvent résoudre uniquement en C++? Je ne connais pas du tout l'Objective-C. –

+0

J'ai résolu ce problème très simplement. J'ai juste déplacé le "ptr_view" à l'autre classe de singleton donc je n'ai pas besoin de faire une telle variable comme "sch" dans chaque classe ... Mais merci beaucoup logan20735, j'ai appris à connaître le pointeur intelligent. –