今天做Android项目的时候出现一个崩溃的问题,该崩溃问题的崩溃日志如下:
signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x3d206578
r0 e5848200 r1 e5859274 r2 0000002c r3 3d20657a
r4 00c80000 r5 009a0000 r6 e5dd4414 r7 d743c468
r8 f7286b88 r9 d7450484 sl d7341000 fp f3d62b5d
ip f3c86fdc sp d743c330 lr f3d38c8b pc 3d206578 cpsr 80010010
d0 5f6c61746f745f61 d1 3434203d206e656c
d2 20656b6361705f70 d3 7461645f74756f20
d4 3736313537383733 d5 3a74726f70642038
d6 203d2074726f7073 d7 30383a3832323434
d8 0000000000000000 d9 0000000000000000
d10 0000000000000000 d11 0000000000000000
d12 0000000000000000 d13 0000000000000000
d14 0000000000000000 d15 0000000000000000
d16 0000708000007080 d17 0000000000007080
d18 0000000000000000 d19 0000000000000000
d20 12f4630012f4ed40 d21 12f4b34012f22c00
d22 0000000000000001 d23 0403040300000000
d24 0000000000000001 d25 0001000100050005
d26 8003800380078007 d27 0023002300030003
d28 0000000000000000 d29 0000000000000000
d30 0000000000000000 d31 0000000000000000
scr 80000010
00 pc 0a605578 /dev/ashmem/dalvik-main space 1 (deleted) (offset 0x1000)
看该堆栈信息,大概能猜到是使用了已经释放的内存
接下来就追踪代码,发现先malloc,然后再使用,不可能是使用的是已经释放的内存啊。实在是想不明白为何提示是使用已经释放的内存啊。苦思冥想,再一点一点的扣代码,发现问题是这样的:
free 释放track内存 =0xe5848200之后(释放了两次), 再申请同等大小的内存分配的是上个释放的内存0xe5848200,然后出现上述问题
总结:当一块内存被释放两次之后,该内存再被申请后,该内存是释放的状态。