Проблема памяти Objective-C ++ - PullRequest
1 голос
/ 04 февраля 2010

У меня проблемы с памятью.

У меня есть библиотека C ++ (эквалайзер от Eyescale), и они используют обход Шаблон посетителя, чтобы позволить вам добавить новые функциональные возможности для своих классов.

Я наконец понял, как это работает, и у меня есть Посетитель, который просто возвращает свойства одного из объектов. (так как я не знаю как они выделены).

так.

Мой маленький код делает это:

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; 
} 

Так вот в чем проблема.

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

НО Если я сделаю это:

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

// честное расположение в памяти и устанавливает w, как проверено в окне отладчика XCode.

Это делает то же самое для Осв.

Я не понимаю. Почему что-то работает в (gdb), а не в коде?

Файл полностью является cpp-файлом, но, похоже, он работает в objc ++, так как мне нужно отключить блокировку.

Помощь !? Я чувствую, что мне не хватает какой-то основной вещи управления памятью здесь, либо с C ++, либо с Obj-C.

[править]

channel-> getWindow () должен сделать это:

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

Код также выполняется нормально, если я запускаю его из приложения, предназначенного только для C ++.

[править]

Нет ... Я пытался создать простую автономную программу, так как устал от запуска ее в качестве плагина. Грязный для отладки.

И нет, он также не запускается в программе на C ++. Так что я действительно в растерянности относительно того, что я делаю неправильно.

Спасибо,

- Стивен Фурлани

1 Ответ

0 голосов
/ 14 мая 2010

Полагаю, я должен ответить и закрыть это.

Методы, которые я использовал, были совершенно небезопасными. Я кричал через потоки, Carbon / Cocoa, C ++ / ObjC.

Само собой разумеется, никогда не делай этого! Я выучил трудный путь.

-Stephen

...