c++指针(1)-规避野指针

一,指针的危险
c++ primer plus中提到:c++中创建指针时,计算机将分配用来存储地址的内存,但不会分配用来存储指针所指向数据的内存。
例如声明int型的指针变量num:

int *num;

此时的num保存的地址值是不确定的,我们称其为野指针。 由于野指针的指向是随机的,比如它有可能是被另外某个程序申请的内存空间,因此改写野指针指向的存储区域就会发生一些难以预料的危险。

二,规避野指针
避免野指针的出现需要注意两点:
1,初始化
再以指针变量num举例。为了避免num乱指一气,声明num后,可以将其置为NULL;

int *numNULL

也可以赋予其另一个变量的地址:

int p = 1int *num = &p;

但这种情况需要特别注意:如果p为局部变量,那么p的内存在释放后num又会成为野指针。

除此之外,还可以利用new来分配内存

int *num = new int;

2,释放置空
如果不再需要num,就要对其进行delete操作,防止内存泄漏。

delete num;

执行这条语句之后,系统收回内存,也就是说num指向的这块内存不再属于当前程序,所以对于当前程序而言num就是一个野指针。这时若再改写num指向的区域,可能就会发生错误。为了避免错误的发生,应使num指向NULL:

numNULL

这样做的另外一个好处就是:delete操作不能对同一个内存块释放两次,这样做会报错。如果第一次delete后置空,第二次delete也是没问题的,因为对空指针做delete是安全的:

int *a = new int;
int *b = a;
delete a;
a = NULL;  //删除这行运行时会出错
delete b;

猜你喜欢

转载自blog.csdn.net/a34434180/article/details/45147281