2010-04-21 5 views
2

Ceci est une meilleure compréhension d'une question que j'avais précédemment.boost :: shared_ptr dans Objective-C++

Je l'Objective-C suivant ++ objet

@interface OCPP 
{ 
    MyCppobj * cppobj; 
} 
@end 

@implementation OCPP 

-(OCPP *) init 
{ 
    cppobj = new MyCppobj; 
} 
@end 

Ensuite, je crée une manière complètement différente obj qui a besoin d'utiliser cppobj dans un boost :: shared_ptr (je n'ai pas le choix en la matière, il fait partie d'un immense bibliothèque que je ne peux pas changer)

@interface NOBJ 
-(void) use_cppobj_as_shared_ptr 
{ 
    //get an OCPP obj called occ from somewhere.. 
    //troubling line here 
} 
@end 

J'ai essayé ce qui suit et qui a échoué: J'ai essayé synthétisant cppobj. Ensuite, j'ai créé un shared_ptr dans "ligne troublante" de la manière suivante:

MyCppobj * cpp = [occ cppobj]; 
bsp = boost::shared_ptr<MyCppobj>(cpp); 

Cela fonctionne très bien la première fois. Ensuite, je détruis le NOBJ et le recréer. Quand je suis pour cppobj c'est parti. Vraisemblablement shared_ptr a décidé que ce n'était plus nécessaire et l'a fait disparaître.

J'ai donc besoin d'aide. Comment puis-je garder cppobj en vie?

Y at-il un moyen de détruire bsp (ou c'est une référence à cppobj) sans détruire cppobj?

+0

Vous ne renvoyez rien de la méthode init. Habituellement, vous retournez 'self' et le type de retour est 'id'. Je suppose que cela vaut aussi pour ObjC++. – MKroehnert

Répondre

3

shared_ptr prend en charge les désallocateurs personnalisés. Ce que vous pouvez faire, c'est ne rien faire.

void no_destroy(MyCppObj*) 
{} 

bsp = boost::shared_ptr<MyCppObj>(cpp, &no_destroy); 
1

Pourquoi ne pas utiliser boost::shared_ptr<MyCppObj> cppobj; dans OCPP au lieu de MyCppobj * cppobj; pour stocker l'instance de MyCppObj?

+0

Alors, comment puis-je passer ce shared_ptr? J'ai essayé cela et pour une raison quelconque, il a échoué. –

+0

Ajoutez une méthode comme celle-ci: "- (boost :: shared_ptr ) getCppobj {return cppobj;}" à la classe OCPP et accédez au membre cppobj via cette méthode. Maintenant, le pointeur appartient à l'instance d'OCPP et ne sera supprimé que lorsque cette instance sera désallouée. – MKroehnert

Questions connexes