文章目录
前言一、指针?二、指针的应用场景三、 空指针四、 悬空指针五、 野指针正确用法总结前言
相信很多小伙伴对指针的使用都有一定的了解了。但更多的人可能对指针又爱又恨。这次我们谈点重要的,进一步加深对指针的理解
一、指针?
指针是一种特别变量,全称是指针变量,专用于存放其它变量在内存中的地址编号。把指针指向具体的内存变量的地址,就是对指针赋值。
二、指针的应用场景
用作函数的参数传递和函数的返回值。 利用指针传递参数,可避免变量复制,减少内存开销,提高效率。三、 空指针
没有赋值的指针变量(没有指向内存变量的地址),对空指针操作会造成程序的段错误(Core dump)
四、 悬空指针
指针指向的内存已释放,但指针的值没有被清零,对悬空指针操作的结果不可预知
int main(void) {int*p=nullptr;int*p2=new int;p=p2;delete p2;}
此时p和p2就是悬空指针,指向的内存已经被释放。继续使用这两个指针,行为不可预知。需要设置为p=p2=nullptr。
解决办法:指针free或delete之后及时置空。
五、 野指针
指的是没有被初始化过的指针。
int main(void) {int*p;//未初始化std::cout<<*p<<std::endl;//未初始化就被使用return 0;}
因此,为了防止出错,对于指针初始化时都是赋值为nullptr,或置空,这样在使用时编译器就不会直接报错,产生非法内存访问。
正确用法
//关闭文件指针void CFile::Close(){if(m_fp==0) return;//检查是否为空指针,是则直接返回fclose(m_fp);//关闭文件指针,这代表着释放了文件指针指向的内存,此时指针就变成了悬空指针m_fp=0;//将悬空指针的值清零,避免隐藏bugmemset(m_filename,0,sizeof(m_filename));//如果存在临时文件就删除它if (strlen(m_filenametmp)!=0) remove(m_filenametmp);memset(m_filenametmp,0,sizeof(m_filenametmp));}
总结
对于指针使用大家要格外小心,写程序时仔细考虑清楚。
野指针和悬空指针都是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。
避免野指针比较简单,但悬空指针比较麻烦。c++引入了智能指针,C++智能指针的本质就是避免悬空指针的产生。