2010-02-04 25 views
1

我有內存問題。Objective-C++內存問題

我有一個C++庫(來自Eyescale的均衡器),他們使用Traversal Visitor Pattern來允許您爲他們的類添加新的功能。

我終於弄清楚它是如何工作的,而且我有一個Visitor,只是 返回其中一個對象的屬性。 (因爲我不知道他們是如何分配的 )。

等等。

我的小代碼做到這一點:

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中的調試器窗口 驗證。

它爲osw做同樣的事情。

我不明白。爲什麼會在(gdb)中有效,但不在代碼中?

該文件完全是一個cpp文件,但它似乎運行在objC++, ,因爲我需要關閉阻止。

幫助!?我覺得我在這裏錯過了一些內存管理基本的東西, 用C++或Obj-C。

[編輯]

通道 - > getWindow()應該做到這一點:

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

如果我從C++運行該代碼還執行精 - 唯一的應用程序。

[編輯]

不......我試圖創建一個簡單的獨立的程序,因爲我累了運行它作爲一個插件。凌亂調試。

不,也不會在C++程序中運行。所以我對我做錯了什麼事情感到不知所措。

感謝,

- 斯蒂芬·富拉尼

+0

你嘗試使用的dynamic_cast (W> getWindow()); ? –

+0

channel-> getWindow()應該返回: eq :: Window * getWindow(){return _window; } 如果我編寫僅用於C++的應用程序,代碼也可以工作。 –

+0

「如果我從一個僅用於C++的應用程序運行它,代碼也可以正常運行。」 - 你如何在objc案例中創建涉及的C++對象?即有什麼不同嗎? – ergosys

回答

0

我想我應該回答,並關閉了這一點。

我使用的方法完全是線程不安全的。我正在通過線程調用Carbon/Cocoa,C++/ObjC。

不用說,永遠不要這樣做!我學會了艱難的道路。

-Stephen