-1
struct trapframe {
      u_int32_t tf_vaddr;     /* coprocessor 0 vaddr register */
      u_int32_t tf_status;    /* coprocessor 0 status register */
      u_int32_t tf_cause;     /* coprocessor 0 cause register */
      u_int32_t tf_lo;
        .....
      u_int32_t tf_hi;
      u_int32_t tf_ra;        /* Saved register 31 */
      u_int32_t tf_at;        /* Saved register 1 (AT) */
      u_int32_t tf_v0;        /* Saved register 2 (v0) */
      u_int32_t tf_v1;        /* etc. */
      u_int32_t tf_epc;       /* coprocessor 0 epc register */
 };

void foo(void *tf, unsigned long as) { 
  struct trapframe *buf_tf = (struct trapframe *)tf; 
  ... }

関数 foo では、スペースを手動で割り当てませんでしたが、一時トラップフレーム構造体ポインター buf_tf を、渡されたトラップフレーム構造体引数で直接初期化しました。buf_tf を手動で解放する必要がありますか?

4

2 に答える 2

0

したがって、おそらく次のようなものがあります。

void myfunc (struct trapframe *p) 
{
    struct trapframe *tf_tmp = p;

    ...
}

この場合、メモリは呼び出し元に割り当てられます。これは、アクセスしている呼び出し元の構造体です。あなたはそれを解放する立場にありません。どこに割り当てられているか (ヒープまたはスタック) がわからず、呼び出し元が後でアクセスする可能性があります。

または多分:

void myfunc (struct trapframe tf) 
{
    struct trapframe *tf_tmp = &tf;

    ...
}

この場合、構造体はコピーによって渡され、関数のローカル スタックに配置されます (ただし、実装の詳細は異なります)。現在の関数が終了すると解放されます。

いいえ、それを解放しようとしないでください。そうすることは、他のものを壊すかもしれません!ヒープに割り当てられていないオブジェクトで実行すると、未定義freeの悪影響が生じる可能性があります。

于 2013-04-14T13:32:35.100 に答える