pointer安全
前言
对指针已经有了大致了解,那么对于指针的安全性也需要有一定把握
正文
1 | int main(){ |
那么当指针p new的内存没有delete的时候,分配到的内存还会存在吗?
可以通过输出p[0]的值看看
发现仍然有值,这个时候这个指针p就被称为悬挂指针,也就是常说的野指针。
解决这种粗心的办法可以用智能指针
No.1
1 | int main(){ |
智能指针之前学过,它的原型是一个类,当这个类超过实例所处作用域的时候会调用析构函数,也就会自动释放内存资源。
在{}作用域内时,智能指针a的生命周期还在,然后指针p接受指针a的地址,出了{}作用域之后,a自动释放了,指针p也就没有指向的内存了,图中两个输出可以看到结果
No.2
1 | int main(){ |
no1的时候由于内存是new的,也就是存放在堆区。
而现在是创建了一个数组,这种方式内存会分配到栈区,按照常理,栈区的变量在离开它所处的作用域后也会自动销毁。
但是通过打印我们发现
它的值仍然在,原因在于数组a的处于栈区时未被回收,如果处于其他函数里就会被回收掉。
结语
- 指针销毁了,但是指向的内存还在
- 内存销毁回收了,指针却还在
指针虽然很方便,但是也挺危险。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Box'Blog!
评论