2009-06-10 6 views
0

J'ai trouvé quelques problèmes pour std::list lorsque je fais un développement de l'iPhone sous Xcode. Voici le code:std :: liste problème pour le développement de l'iPhone

///////////// interface ////////////// 

class CObj 
{ 
public: 
    int value; 
}; 

typedef std::list<CObj*> ObjList; 

@interface testAppDelegate : NSObject <UIApplicationDelegate> { 
    UIWindow *window; 
    ObjList  m_objs; 
} 



//////////// implementation ///////// 

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{  

    for (int i = 0; i< 10; i++) 
    { 
     CObj* obj = new CObj; 
     obj->value = i; 
     m_objs.push_back(obj); 
    } 

    NSLog(@"%d objects",m_objs.size()); 

    ObjList::iterator it = m_objs.begin(); 
    while (it != m_objs.end()) 
    { 
     CObj* obj = *it; 
     if (obj->value == 3) 
      it = m_objs.erase(it); 
     else 
      it++; 
    } 

    NSLog(@"%d objects",m_objs.size()); 
} 

L'application se bloque simplement à m_objs.push_back. Mais si je change le std::list en std::vector, tout va bien. Une idée? Merci

+0

Que dit le message d'erreur? Y a-t-il une trace de pile? – drewh

+0

En aparté, il y a un autre bug dans le code: vous ne supprimez pas l'objet que vous supprimez de la liste. Vous avez besoin d'un 'delete obj' à côté de l'effacement. –

Répondre

0

Par défaut, Objective-C n'appelle pas le constructeur pour les types C++ à l'initialisation.

Si vous définissez cet indicateur dans les paramètres de génération "Appel C++ par défaut Ctors/Dtors dans Objective-C", il va changer le comportement par défaut. Sachez que l'indicateur n'apparaît que si la cible est définie sur Périphérique.