• 所有权不清晰(谁分配,谁释放?)
• 对象类型不清晰(栈对象、堆对象、数组对象、资源句柄?)
• 错误百出的指针
• 内存泄漏——忘记delete之前new的内存
• 悬浮指针—— 使用已释放内存(读取、或写入)、返回栈对象地址
• 重复删除—— 对已经删除过的对象,进行二次删除
• 删除非堆对象指针——对栈对象、全局/静态对象地址进行删除
• 分配与删除错误匹配—— new和free搭配,malloc和delete搭配,new和
delete搭配,new[]和delete[] 搭配
int * parray =new int[100];
单纯只看看到parray,只能知道是个 int * , 不能确定是 delete parray or delete [] parray ;
• 使用空指针
• 使用失效引用(悬浮引用,悬浮指针)
关于裸指针的各种错误使用
int* glob;
void process(int* q){
// …
glob = q;
}
void g1(){
int* p = new int{7};
process(p);
delete p;//删除了堆内存,但是全局变量还指向了这块内存区域
// …
*glob = 9; //悬浮指针
}
void g2(){
int* p = new int{7};
process(p);
delete p;
// …
delete glob; //重复释放
}
void g3(){
int x = 7;
int* p = &x;
process(p);
// …
delete glob;// 释放栈指针
}