У меня проблемы с памятью.
У меня есть библиотека 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 ++. Так что я действительно в растерянности относительно того, что я делаю неправильно.
Спасибо,
-
Стивен Фурлани