我有一段代碼,其中我有類似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