悬挂指针:指向已经被释放的内存区域或者指向无效的内存区域
野指针: 指向未知内存区域,或者指针本身未分配内存地址
悬挂指针和野指针都会导致程序出现错误,产生的原因不一样,是两个概念
悬挂指针通常由于下面几个原因产生
悬挂指针可能会导致严重的错误和未定义的行为。当尝试通过悬挂指针解引用或访问其指向的内存时,可能会访问到无效的内存区域,导致程序崩溃、数据损坏或其他不可预测的行为
情况一:
#include
using namespace std;
int main()
{
int *p = new int(5);
cout<<"*p = "<<*p<
输出结果:
linuxy@linuxy:~/wildPointer$ ./main
*p = 5
p 地址:0x55a885ef6eb0
p 地址:0x55a885ef6eb0
*p = 0
linuxy@linuxy:~/wildPointer$
p 指针在被 free 后,成为悬空指针,被 NULL 赋值后不再是悬空指针。
注意:这里 free 掉的是 p 的内存空间,并不是变量 p
free 前后 p 的地址是不变的,free 释放的是 p 指向的内存空间,释放后表示该快内存可以重新分配了,至于 free 后 *p 的值,视不同编译器情况而不同
情况二:
#include
using namespace std;
int* getVal() {
int tmp = 10;
return &tmp;
}
int main()
{
int *p = getVal(); //悬空指针
cout<<"*p = "<<*p<
在函数 getVal 执行完后,局部变量的内存空间会被释放,而这里 p 指向了函数内的局部变量,p 便成为了悬空指针,可以将 tmp 变为 static 的
一般是指针没有初始化
#include
using namespace std;
int main()
{
int *p; // 野指针
int *q = NULL; // 非野指针
p = new int(5); // p 现在不再是野指针
q = new int(10);
cout<<"*p = "<<*p<
代码出自下面
原文链接:https://blog.csdn.net/nyist_zxp/article/details/119478944
内存泄露的是分配的内存空间在不再使用时未被正确释放,导致这些内存无法再被程序访问到,同时仍然占用系统资源。内存泄露的本质是对内存的浪费。
防止办法
由于原始指针忘记删除,或者释放内存没有将其置空,导致悬空指针,会产生程序崩溃或者其他不良后果。特别是函数内部有异常,delete的语句执行不到,这种情况就比较复杂
智能