内存释放一定是 new 和 delete成对使用的,delete只能delete指向new且没有delete过的指针,或者空指针,其它都不行,记住这句话,记住成对,一定严格遵守,不然就会出很多错误
delete指向其它任何位置的指针都会导致严重问题。包括指向已经delete过的new的指针,通过其它任何方式得到的指针,对象取址,指针运算等。
由此
delete之后的指针一定要赋值为空
一个例子,Android项目中jni代码中创建的一个指针,然后通过取值赋值,后面给delete了。结果导致一个莫名其妙的崩溃,报错显示在glide queue线程上,Bitmap_destruce, BitmapWrap啥啥啥的,找了半天错,才发现是这个。
因为方法中 取址 赋值给这个指针,最后内存分配给glide了,然后delete,glide的线程就直接挂了。
malloc和free同理
崩溃分析: linux的崩溃机制.程序奔溃
在Unix-like系统中,所有的崩溃都是编程错误或者硬件错误相关的,系统遇到不可恢复的错误时会触发崩溃机制让程序退出,如除零、段地址错误等。异常发生时,CPU通过异常中断的方式,触发异常处理流程。不同的处理器,有不同的异常中断类型和中断处理方式。
linux把这些崩溃中断处理,统一为信号量,可以注册信号量向量进行处理。
三、常见崩溃类型及原因
1、SIGSEGV 段错误
SEGV_MAPERR 要访问的地址没有映射到内存空间。 比如上面对空指针的写操作, 当指针被意外复写为一个较小的数值时。
SEGV_ACCERR 访问的地址没有权限。比如试图对代码段进行写操作。
2、SIGFPE 浮点错误,一般发生在算术运行出错时。
FPE_INTDIV 除以0
FPE_INTOVE 整数溢出
3、SIGBUS 总线错误
BUS_ADRALN 地址对齐出错。arm cpu比x86 cpu 要求更严格的对齐机制,所以在 arm cpu 机器中比较常见。
4、SIGILL 发生这种错误一般是由于某处内存被意外改写了。
ILL_ILLOPC 非法的指令操作码
ILL_ILLOPN 非法的指令操作数



