指针常见的错误
1 内存泄漏
造成内存泄漏的几种情况:
①通过c语言的malloc系统函数以及c++的new运算符动态内配的内存空间,使用完之后程序员没有手动释放! ②在有异常处理的程序中,即时使用了free或者delete但是由于异常的原因没有得到执行
/* 这里提供一段伪代码 */
try{
type* pointer = malloc(sizeof(type));
//此处抛出异常
free(pointer); //这里不会执行
}catch(...){
//捕捉到异常
}
复制代码
2 野指针的使用
基本概念:野指针指的是指向"垃圾"内存的指针
指针变成野指针的情况概述:
①free或者delete之后的指针,free和delete只是释放了该指针指向的内存空间,"但是该指针的值还是malloc或者new分配的内存的地址",继续使用它去访问这个内存地址是会发生错误的!
注意:当释放掉动态内存空间之后,将先前指向它的指针的值设置为NULL;在创建指针变量的时候,给指针一个初始值,因为不指定初始值的话,指针的值是随机的,这有时候会导致不可预期的错误!
建议:定义指针变量的时候尽量初始化,哪怕初始化为NULL也好;这是一个很好的编程习惯!
②将局部变量的地址返回
出现的问题:因为a是局部变量,只有在func函数作用域中有效,它的内存空间是属于栈内存的,一旦func执行完之后,系统会自动回收它的内存空间,所以再次使用的话会发生错误!
解决方法:将局部变量使用static修饰,因为在c++中,static修饰的变量的生命周期是整个程序运行期间,与程序"同生共死";
int* func(){
int a = 8;
return &a;
}
int main(){
int* p = func();
cout<<"p:"<<*p<<"\n";
}
复制代码
3 NULL指针
出现NULL指针的情况
①使用malloc或者new动态分配内存的时候:
对于malloc和new来说,当内存分配失败的时候回返回NULL,所以如果不做判断的话就会发生错误;
②当使用指针作为函数的参数的时候:
对于含有指针参数的函数来说,当使用者传入一个NULL的指针的话也是会发生错误的;
注意:为了避免以上两种情况的发生,我们再程序中加一个if判断
if (pointer == NULL)
停止执行任务
复制代码