智能指针 相关概念

1.悬挂指针和野指针

悬挂指针:指向已经被释放的内存区域或者指向无效的内存区域

野指针: 指向未知内存区域,或者指针本身未分配内存地址

悬挂指针和野指针都会导致程序出现错误,产生的原因不一样,是两个概念

1.1 悬挂指针

悬挂指针通常由于下面几个原因产生

  • 指针指向的内存被释放后,未将指针置空(使用delete或者free等释放内存后,没有将指针设置为NULL), 此时如果尝试通过该指针访问已经释放的内存,将会导致未定义行为,如程序崩溃或数据损坏
  • 指针指向函数内部的局部变量(栈上变量),该函数执行完,局部变量所占用内存会被回收。如果外部仍有指针指向这个局部变量,这个指针就会变成悬挂指针

悬挂指针可能会导致严重的错误和未定义的行为。当尝试通过悬挂指针解引用或访问其指向的内存时,可能会访问到无效的内存区域,导致程序崩溃、数据损坏或其他不可预测的行为

情况一:

#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 的

1.2 野指针

一般是指针没有初始化

#include 
using namespace std;
 
int main()
{
    int *p;     // 野指针
    int *q = NULL; // 非野指针
    p = new int(5);  // p 现在不再是野指针
    q = new int(10); 
    cout<<"*p = "<<*p<内存泄露的本质是对内存的浪费

防止办法

  • new和delete, malloc和free成对出现
  • 智能指针
  • 内存泄漏检测工具

3. 智能指针

由于原始指针忘记删除,或者释放内存没有将其置空,导致悬空指针,会产生程序崩溃或者其他不良后果。特别是函数内部有异常,delete的语句执行不到,这种情况就比较复杂

智能

你可能感兴趣的:(智能指针 相关概念)