問題タブ [raw-pointer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ベクターから要素を削除した後のセグメンテーション違反
私は現在、プロジェクト、より正確にはタングラム ゲームに取り組んでいます。セグメンテーション違反に問題があり、その理由がわかりません。
プロジェクト全体があることを考えると、問題を単純化しようとします: 特に Menu オブジェクト (およびその他のもの) を含む GameManager クラスがありますが、それは重要ではないと思います。gameManager はこれを初期化するために使用されます。 Menu には Button のベクトルが含まれています (各ボタンには、ユーザーがクリックしたときにアクションを実行するためのラムダがあります)。
それがどのように機能するかを説明するために、例を挙げます。ユーザーが「ロード」ボタンをクリックすると、gameManager はメニューに含まれる現在のボタンを削除し、そのメニューに新しいボタンを追加します。
そのコード サンプルには、"Load" や "Quit" などのいくつかのボタンを menu に追加するメソッド initMainMenuButtons があります。ユーザーが「作成」をクリックすると、インターフェイスを変更したい(ボタンの追加と削除)。したがって、ボタンを削除するには、メソッド clear() を呼び出します。
unique_ptr を使用しているため、手動でボタンを削除する必要はありません。これまでのところ、問題はありません。ボタンのベクトルは空 (サイズは 0) のようです。次に、メソッド initCreateLevelButtons() が呼び出されます。このメソッドは initMainMenu と非常によく似ています: メニューにボタンを追加するだけです。この呼び出し中、ボタンはベクターに正しく追加されているように見えます。ベクターの内容を最後に出力すると、ベクターには正しいボタンが含まれています。
そして、問題が発生します。initCreateLevelButtons() の呼び出し後、メニューを使用したいときにセグメンテーション違反が発生するため、actionManager->setMenu(menu);
機能しません。menu を印刷して、std::cout << menu << std::endl
このポインターが nullptr かどうかをテストしようとしましたが、どちらも機能しません。メニューが initCreateLevelButtons() の最後の行で正しいように見え、直後に無効になる理由がわかりません。ボタンのベクトルをクリアしない場合 (メニュー -> クリア命令)、プログラムは動作しますが、最後のボタンはまだここにあります)。
私は生のポインターを使用しようとしましたが、ボタンが削除されない限り、プログラムがベクトルをクリアできることに気付きました (ボタンを削除するループを追加すると、問題が発生します)。ボタンの削除。理由がわかりません、行き詰まっています。すでに述べたように、コードはプロジェクト全体の一部であるため、他のものを導入せずにクラスを導入するのは難しいため、うまく説明したかどうかはわかりません。メソッドの詳細または完全なコードが必要な場合は、提供できます。
ios - 弱い UnsafeMutableRawPointer を作成する
CoreAudio メソッドを使用しようとしていAUGraphAddRenderNotify(...)
ますが、通知ブロック内でこの通知を作成したクラスへの参照が必要です。これは C 関数であるため、単純に[weak self] in
クロージャ キャプチャを追加することはできません。Documentationを見ると、このメソッドの最後のパラメーターはUnsafeMutableRawPointer
、ブロックの実行中に最初のパラメーターとして渡されることが許可されています。この提案に従って、私が持っているコードは次のとおりです。
これが私の質問です
。このポインターの背後にある値を安全に取得する方法を理解する必要があります (nil を考慮して)。より具体的には、audioPlayer に安全にアクセスし、使用するまでに割り当てが解除されていないことを確認したいと考えています。現在、audioPlayer の割り当てが解除され、アプリがクラッシュするまで、すべてが正常に機能します。オブジェクトの割り当てが解除される前に通知を停止するために使用できることはわかっていAUGraphRemoveRenderNotify(...)
ますが、残念ながら、この方法は私が探しているものではありません。ポインターが指しているオブジェクトが既に割り当て解除されているかどうかを確認するにはどうすればよいですか?
前もって感謝します!