2010-02-04 4 views
1

J'ai des problèmes de mémoire. J'ai une bibliothèque C++ (Egaliseur de Eyescale) et ils utilisent le modèle Traversal Visitor pour vous permettre d'ajouter de nouvelles fonctionnalités à leurs classes.Problème de mémoire Objective-C++

J'ai enfin compris comment cela fonctionne, et j'ai un visiteur que juste retourne les propriétés de l'un des objets. (puisque je ne sais pas comment ils sont alloués ).

ainsi.

Mon petit code fait ceci:

VisitorResult AGLContextVisitor::visit(Channel* channel) 
{ 
    // Search through Nodes, Pipes until we get to the right window. 
    // Add some code to make sure we find the right one? 

    // Not executing the following code as C++ in gdb? 
    eq::Window* w = channel->getWindow(); 
    OSWindow* osw = w->getOSWindow(); 
    AGLWindow* aw = (AGLWindow *)osw; 
    AGLContext agl_ctx = aw->getAGLContext(); 
    this->setContext(agl_ctx); 

    return TRAVERSE_PRUNE; 
} 

est donc ici le problème.

eq::Window* w = channel->getWindow(); 
(gdb) print w 
0x0 

mais si je le fais:

(gdb) set objc-non-blocking-mode off 
(gdb) print w=channel->getWindow() 
0x300effb9 

// un emplacement mémoire honnête et jeux w comme vérifié dans la fenêtre Débogueur de XCode.

Il fait la même chose pour osw.

Je ne comprends pas. Pourquoi quelque chose fonctionnerait dans (gdb) mais pas dans le code?

Le fichier est entièrement un fichier cpp, mais il semble fonctionner dans objC++, car je dois désactiver le blocage.

Aide !? J'ai l'impression de manquer quelque chose de base de gestion de la mémoire ici, soit avec C++ ou Obj-C.

[modifier]

channel-> getWindow() est censé faire:

/** @return the parent window. @version 1.0 */ 
Window* getWindow() { return _window; } 

Le code exécute aussi bien si je le lance à partir d'un C++ - seule application.

[modifier]

Non ... J'ai essayé de créer un programme simple autonome depuis que je suis fatigué de courir comme un plug-in. Sale à déboguer.

Et non, il ne s'exécute pas non plus dans le programme C++. Donc, je ne sais vraiment pas ce que je fais de mal.

Merci,

- Stephen Furlani

+0

avez-vous essayé d'utiliser dynamic_cast (W-> getWindow()); ? –

+0

channel-> getWindow() est supposé renvoyer: eq :: Window * getWindow() {return _window; } Le code fonctionne également si j'écris une application C++ uniquement. –

+0

"Le code s'exécute également correctement si je l'exécute à partir d'une application C++ uniquement." - Comment créez-vous les objets C++ impliqués dans le cas d'objc? C'est à dire. Qu'est-ce qui est différent? – ergosys

Répondre

0

Je suppose que je devrais répondre et fermer cela.

Les méthodes que j'utilisais étaient complètement insécures. J'appelais à travers les threads, Carbon/Cocoa, C++/ObjC.

Inutile de dire, ne faites jamais cela! J'ai appris à la dure.

-Stephen