1

私は記憶の問題を抱えています。

私はC++ライブラリ(EyescaleのEqualizer)を持っており、トラバーサルビジターパターンを使用して、クラスに新しい機能を追加できるようにしています。

私はついにそれがどのように機能するかを理解しました、そして私はオブジェクトの1つからプロパティを返すだけの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 

//正直なメモリ位置であり、XCodeのデバッガウィンドウで検証されたようにwを設定します。

oswでも同じことをします。

理解できません。(gdb)で何かが機能するのに、コードでは機能しないのはなぜですか?

このファイルは完全にcppファイルですが、ブロッキングをオフにする必要があるため、objc++で実行されているようです。

ヘルプ!?ここでは、C++またはObj-Cのいずれかでメモリ管理の基本的なことが欠けているように感じます。

[編集]

channel-> getWindow()はこれを行うことになっています:

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

C ++のみのアプリケーションから実行した場合も、コードは正常に実行されます。

[編集]

いいえ...プラグインとして実行するのにうんざりしていたので、単純なスタンドアロンプ​​ログラムを作成してみました。デバッグが面倒です。

いいえ、C++プログラムでも実行されません。だから私は自分が間違っていることについて本当に途方に暮れています。

ありがとう、

--Stephen Furlani

4

1 に答える 1

0

私は答えてこれを閉じるべきだと思います。

私が使用していた方法は完全にスレッドセーフではありませんでした。私はスレッド間で、Carbon / Cocoa、C ++/ObjCを呼び出していました。

言うまでもなく、絶対にしないでください。私は難しい方法を学びました。

-スティーブン

于 2010-05-14T14:13:22.123 に答える