前言

对指针已经有了大致了解,那么对于指针的安全性也需要有一定把握


正文

1
2
3
4
5
6
7
8
9
10
int main(){
int *p;
{
int *a = new int[10];
p = a;
p[0] = 250;
}

return 0;
}

那么当指针p new的内存没有delete的时候,分配到的内存还会存在吗?
可以通过输出p[0]的值看看
发现仍然有值,这个时候这个指针p就被称为悬挂指针,也就是常说的野指针。

解决这种粗心的办法可以用智能指针


No.1

1
2
3
4
5
6
7
8
9
10
int main(){
int *p;
{
std::unique_ptr<int[]> a{ std::make_unique<int[]>(50) };
a[2] = 110;
p = a.get();
}

return 0;
}

智能指针之前学过,它的原型是一个类,当这个类超过实例所处作用域的时候会调用析构函数,也就会自动释放内存资源。

在{}作用域内时,智能指针a的生命周期还在,然后指针p接受指针a的地址,出了{}作用域之后,a自动释放了,指针p也就没有指向的内存了,图中两个输出可以看到结果


No.2

1
2
3
4
5
6
7
8
9
10
11
int main(){
int *p;
{
int a[5] = { 1,2,3,4,5 };
p = a;
std::cout << p[2] << std::endl;
}
std::cout << p[2] << std::endl;

return 0;
}

no1的时候由于内存是new的,也就是存放在堆区。
而现在是创建了一个数组,这种方式内存会分配到栈区,按照常理,栈区的变量在离开它所处的作用域后也会自动销毁。
但是通过打印我们发现
它的值仍然在,原因在于数组a的处于栈区时未被回收,如果处于其他函数里就会被回收掉。


结语

  1. 指针销毁了,但是指向的内存还在
  2. 内存销毁回收了,指针却还在

指针虽然很方便,但是也挺危险。