問題タブ [dangling-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.
pointers - Windows API アプリケーション定義のコールバック関数で、ポインター パラメーター データの有効期間は? コールバックが戻った後も持続しますか?
例として、呼び出し元がコールバック関数EnumWindowStations()
を渡す必要がある を見てみましょう。EnumWindowStationsProc()
コールバック関数は、現在のターミナル セッションのウィンドウ ステーションごとに 1 回呼び出されます。コールバック関数のシグネチャを見てみましょう。
最初のパラメーターは、文字列データへのポインターです。その文字列バッファーは、コールバック呼び出し用に明示的に割り当てられましたか? また、コールバックが返された直後、または列挙関数が返される直前に解放されますか? または、文字列バッファーが割り当てられたままになり、後で使用できるように、ポインターはある種の永続メモリを指していますか?
これは重要なポイントです。永続的でない場合、たとえば、生のポインターをグローバル コンテナーに格納して、コールバックと完全な列挙プロセスが完了した後にアクセスするのは正しくないためです。代わりに、コールバックが戻る前に、基になる文字列データをアプリケーションによって制御されるバッファーにコピーする必要があります。
公式ドキュメントでは、文字列データの有効期間が明確にされていないようです。パラメータの説明には次の 1 行しかありません。
lpszWindowStation [入力]
ウィンドウ ステーションの名前。
また、ドキュメント ページのどこにも、文字列データの有効期間については記載されていません。また、この質問に「一度だけ」、つまり Windows API でのコールバック イディオムのすべての使用について答えている MSDN ページを見つけたことを思い出すこともできません。
現時点では、EnumWindowStations()
/のEnumWindowStationsProc()
ケースに最も関心がありますが、回答者が一般的なケース、つまりすべての Windows API コールバック関数について想定するものに対処するのが最善です。
c++ - CreateFile2、WriteFile、および ReadFile: 16 バイト アラインメントを強制するにはどうすればよいですか?
CreateFile2 と WriteFile を使用してファイルを作成して書き込み、後で readfile を使用して一度に 16 バイトを __m128i に読み込み、simd 操作を実行しています。デバッグ モードでは問題なく動作しますが、リリース モードではアクセス拒否 (0xc0000005) エラー コードがスローされます。私の経験では、これは、16 バイトで整列されていないものを 16 バイトで整列されたものに押し込もうとしているときに発生します。ただし、16 バイト アラインメントの欠如が最初にどこで頭を悩ませているのかはわかりません。
それは CreateFile2() 呼び出しにありますか?
... WriteFile() 呼び出しで?
...後の ReadFile() 呼び出しで?
ここで 16 バイト アラインメントを強制するにはどうすればよいですか?
ありがとう!