我有一段代码,其中我有类似free()调用:程序随机崩溃由于在多个线程中
int *mem_ptr;
.
.
if(mem_ptr)
{
free(mem_ptr);
}
.
.
该应用程序是多线程的。有时,一个线程会通过if
检查,然后free()
发生上下文切换,另一个线程也会通过if
检查并执行free()
。现在,当控制回到第一个线程时,它在free()
处崩溃,给出错误Abort message: 'invalid address or address of corrupt block 0x40735cb0 passed to dlfree'
。
除了互斥,有没有更好的方式来处理这种情况
PS:我的工作在Android原生料在C++中,这一段代码是onTransact()
调用中。
你不能使用shared_ptr的?如果不是,使用原子增量和减量来实现一个ref-counting机制将是值得的。 – Arunmu
Arunmu的权利 - 你的逻辑内在地被打破,不仅仅是因为潜在的多重释放,还因为一个线程可能释放指向内存,而另一个线程继续使用它(尚未使它成为“if”)。 Jeegar关于使'free(mem_ptr)'原子的答案不足以获得可靠的工作代码。 –
确保mem是通过malloc分配的 – David