C++ 野指针和悬空指针

我就是我 2023-01-16 11:28 401阅读 0赞

都是是指向无效内存区域(这里的无效指的是”不安全不可控”)的指针,访问行为将会导致未定义行为。

野指针:指的是没有被初始化过的指针。

  1. int main(void) {
  2. int * p;
  3. std::cout<<*p<<std::endl;
  4. return 0;
  5. }

因此,为了防止出错,对于指针初始化时都是赋值为 nullptr,这样在使用时编译器就会直接报错,产生非法内存访问。

悬空指针:指针最初指向的内存已经被释放了的一种指针。

  1. int main(void) {
  2. int * p = nullptr;
  3. int* p2 = new int;
  4. p = p2;
  5. delete p2;
  6. }

此时 p和p2就是悬空指针,指向的内存已经被释放。继续使用这两个指针,行为不可预料。需要设置为p=p2=nullptr。此时再使用,编译器会直接保错。

避免野指针比较简单,但悬空指针比较麻烦。c++引入了智能指针,C++智能指针的本质就是避免悬空指针的产生。

产生原因及解决办法:

野指针:指针变量未及时初始化 => 定义指针变量及时初始化,要么置空。

悬空指针:指针free或delete之后没有及时置空 => 释放操作后立即置空。

发表评论

表情:
评论列表 (有 0 条评论,401人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C++ 指针悬空指针

    都是是指向无效内存区域(这里的无效指的是"不安全不可控")的指针,访问行为将会导致未定义行为。 野指针:指的是没有被初始化过的指针。 int main(void) 

    相关 指针悬空指针

    概念 野指针:不确定其具体指向的指针。“野指针”最常来自于未初始化的指针。 悬空指针:最初指向的内存已经被释放了的一种指针。 危害 指针指向的内存不可控,访问

    相关 C语言指针

    野指针产生原因:利用 free函数释放了指针的内存空间 但指针本身没有重置为NULL 造成 释放的时候 仍可以通过 p!=NULL 进行判断 避免方法 在定义指针时