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参数初始化临时陷阱结构指针buf_tf,我是否需要手动释放buf_tf?
答案 0 :(得分:0)
1)不,如果您不需要免费提供trapframe struct argument passed in
2)是的,如果你必须最终释放trapframe struct argument passed in
答案 1 :(得分:0)
所以,大概你有这样的事情:
void myfunc (struct trapframe *p)
{
struct trapframe *tf_tmp = p;
...
}
在这种情况下,内存在调用者中分配,它是您正在访问的调用者的结构。你无法释放它。您不知道它的分配位置(堆或堆栈),调用者可能希望以后访问它。
或者也许:
void myfunc (struct trapframe tf)
{
struct trapframe *tf_tmp = &tf;
...
}
在这种情况下,struct通过复制传递并放在函数的本地堆栈上(尽管实现细节有所不同)。当前函数退出时将释放它。
所以不,不要试图释放它。这样做可能会打破其他事情!对未在堆上分配的对象执行free
可能会产生 undefined 的错误效果。