2013-04-14 2 views
-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 указатель структура buf_tf с trapframe STRUCT переданного аргумента в, мне нужно освободить buf_tf вручную?с свободной структура указатель

+2

Ваш вопрос не очень ясен. –

+0

Пожалуйста, покажите свой код. Кажется, у вас смешанные указатели на структуру и структура как-то –

ответ

0

Так, вероятно, у вас есть что-то вроде это:

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

    ... 
} 

в этом случае память выделяется в вызывающей, это структура вызывающего абонента вы обращаетесь. Вы не в состоянии освободить это. Вы не знаете, где оно выделено (куча или стек), и вызывающий может захотеть получить к нему доступ позже.

или, может быть:

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

    ... 
} 

В этом случае структура передается по копии и помещается на локальный стек вашей функции (хотя детали реализации различаться). Он будет освобожден, когда текущие функции выйдут.

Так что нет, не пытайтесь его освободить. Это может сильно нарушить другие вещи! Выполнение free на объект, который не был выделен на кучу, может иметь плохие последствия, которые являются undefined.

+0

Да, struct trapframe * tf должен использоваться функцией caller, поэтому я не могу освободить tf через buf_tf в функции foo. –

0

1) Нет, если вам не нужно, чтобы освободить его, если вы не должны освободить trapframe struct argument passed in 2) Да, если у вас есть, чтобы в конечном счете освободить trapframe struct argument passed in

Смежные вопросы