-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 中,我没有手动分配空间,而是使用传入的 trapframe struct 参数直接初始化 temp trapframe struct 指针 buf_tf,我需要手动释放 buf_tf 吗?

4

2 回答 2

0

1)不,如果你不需要释放它,如果你不需要释放trapframe struct argument passed in 2)是的,如果你最终必须释放trapframe struct argument passed in

于 2013-04-14T13:25:09.417 回答
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 回答