野指针和空悬指针的区别有哪些

2023-12-09 0 1,176

正文:

野指针空悬指针的区别在于它们的定义和使用方式。野指针是指未初始化或者已经释放的指针,它指向的内存地址是不确定的,可能是任意的值。而空悬指针是指已经释放的指针,它指向的内存地址是无效的,可能已经被其他程序或者操作系统重新分配给其他变量使用。因此,使用野指针和空悬指针都是不安全的,可能导致程序崩溃或者产生不可预测的结果。为了避免野指针和空悬指针的问题,我们应该在使用指针之前进行初始化,并在释放指针后将其设置为 nullptr。这样可以确保指针指向有效的内存地址,避免出现潜在的错误。

1.野指针

野指针是指已经指向某块内存的指针,但该内存区域已被释放或不再有效,而指针本身仍保留该地址。

产生原因:

野指针的产生原因包括使用 delete 或 free 释放指针指向的内存后,但忘记将指针置为 nullptr(C++)或 NULL(C)。另外,指向局部变量的指针也可能成为野指针,因为局部变量的生命周期已结束。

危险性:

野指针的危险性在于访问它可能导致程序崩溃、未定义的行为,或者产生不可预测的结果,因为指针指向的内存可能已被其他程序使用或释放。

2.空悬指针

空悬指针是指指针本身合法,但指向的对象已被销毁或不再有效。

产生原因:

空悬指针的产生原因包括指向对象的引用,在对象被销毁后,引用仍然存在;以及返回局部对象的指针或引用,在函数返回后,局部对象已不存在。

危险性:

使用空悬指针可能导致程序崩溃、未定义的行为,或者产生不可预测的结果,因为引用的对象已不存在或被其他数据覆盖。

例子:


#include <iostream>

int* createInt() {
    int x = 5;
    <a href="https://www.huizhanii.com/tag/return" class="tag-link" title="查看 return 相关文章">return</a> &x; // 返回局部变量的指针
}

int main() {
    int* ptr = createInt();
    // 在这里,ptr 成为野指针,因为它指向的是已经销毁的局部变量
    std::cout << *ptr << std::endl; // 可能导致未定义行为

    // 其他可能导致野指针的操作
    int* deletedPtr = new int;
    delete deletedPtr;
    std::cout << *deletedPtr << std::endl; // deletedPtr 成为野指针

    // <a href="https://www.huizhanii.com/tag/%e7%a9%ba%e6%82%ac%e6%8c%87%e9%92%88" class="tag-link" title="查看空悬指针相关文章">空悬指针</a>
    int* danglingPtr = nullptr;
    {
        int x = 10;
        danglingPtr = &x; // x 的生命周期结束后,danglingPtr 成为空悬指针
    }
    std::cout << *danglingPtr << std::endl; // 可能导致未定义行为

    <a href="https://www.huizhanii.com/tag/return" class="tag-link" title="查看 return 相关文章">return</a> 0;
}
收藏 (0)

微信支付 微信扫一扫

支付宝支付 支付宝扫一扫

打赏二维码
点赞 (0)

站长资源下载中心-找源码上汇站

常见问题
  • 如果付款后没有弹出下载页面,多刷新几下,有问题联系客服!
查看详情
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
查看详情

相关文章

联系官方客服

为您解决烦忧 - 24小时在线 专业服务