2

プロセスを作成して終了するのを待った後、STARTUPINFO はまだ利用可能ですか、それとも破棄されていますか?

STARTUPINFO si;

bRes = CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

dwRes = WaitForSingleObject(pi.hProcess, INFINITE);

この後、si変更/破棄されますか、それともそのまま残されますか?

4

3 に答える 3

0

あなたがしたようにそれを宣言した場合

STARTUPINFO si;

次に、宣言されたプログラムの部分が終了すると、C によって破棄されます (「範囲外」と呼ばれます)。例えば:

void myfunct() {
  STARTUPINFO si1;
  if (condition) {
    STARTUPINFO si2;
    //...
  } //si2 destroyed here
  //...
} //si1 destroyed here

CreateProcess()関数が si1 または si2 を保存したくてもできませんでした。あなたが何をしても、それらはその時点で破壊されるからです.

ここで、次のように si を作成したとします。

STARTUPINFO *si = malloc(sizeof(STARTUPINFO));

次に、明示的に呼び出した場合にのみ破棄されます

free(si);

一部の API 関数では、保持できるものを提供する必要があります。これらの関数では、パラメーターを 1 秒で、またはさらに複雑な方法で割り当てる必要があり、後で破棄する必要がある正確なタイミングがドキュメントで示されます。

しかし、ほとんどの API 関数は、渡されたものをそのままコピーし、ソースはそのままにしておくため、最初の方法で宣言された構造体へのポインターを渡すことは問題ありません。

一般に、「何かを API に渡し、API がそれを破棄することに依存する」ことは問題であることに注意してください。呼び出すアプリケーションと API 関数は、おそらく異なるメモリ マネージャーを使用します。1 つに割り当てられたものを別の場所で解放することはできません。

そのため、ほとんどの場合、そのような API では、特定の関数を呼び出してデータを割り当てるか、(より一般的には) 後でデータを自分で削除する必要があります。

MYPARAM *p = malloc(sizeof(MYPARAM));
APIOpen(p);
//...much later
APIClose(p);
//It's now safe to free p
free(p);
于 2013-03-21T10:08:22.013 に答える
0

Windows が作成する STARTUPINFOのコピーは破棄されます。ただし、CreateProcess 関数に指定した構造はまだ存在しています。

于 2013-03-21T09:46:38.937 に答える