C/C++野指针

2024年 1月 14日 76.4k 0

野指针是指向“不确定”或“非法”内存区域的指针。

它们通常由不正确的指针使用和内存管理导致,可能会导致程序崩溃或不可预测的行为。

图片[1]-C/C++野指针-不念博客

产生野指针的常见情况

  • 未初始化的指针:
    • 分配指针变量但未初始化时,它包含随机内存地址,这可能指向任何位置。
  • 已释放的内存:
    • 当内存被释放(如使用 delete 或 free),指向该内存的指针仍然存在。此时该指针变成了野指针。
  • 超出作用域的指针:
    • 当指针指向一个局部变量,而该变量已经超出作用域,指针变成野指针。
  • 示例

    #include <iostream>
    
    int* createPointer() {
        int a = 10;
        return &a; // 返回局部变量的地址,导致野指针
    }
    
    int main() {
        int *p; // 未初始化的指针
        *p = 10; // 未定义行为,p 是野指针
    
        int *q = new int(20);
        delete q; // q 现在是野指针
    
        int *r = createPointer(); // r 是野指针
        std::cout << *r << std::endl; // 未定义行为
    
        return 0;
    }

    在这个例子中,p 是未初始化的指针,q 在释放内存后变成野指针,r 因为指向超出作用域的内存而成为野指针。

    避免野指针的策略

  • 初始化指针:
    • 总是初始化指针。可以初始化为 nullptr 或一个有效的内存地址。
  • 释放后置空:
    • 释放指针指向的内存后,立即将指针置为 nullptr。这可以防止悬挂指针(dangling pointer)。
  • 避免返回局部变量的地址:
    • 不要返回函数内局部变量的地址。如果需要,可以使用动态分配的内存或者通过参数传递指针。
  • 使用智能指针:
    • 尽可能使用 C++ 的智能指针(如 std::unique_ptr 和 std::shared_ptr),它们可以帮助自动管理内存,减少野指针的风险。
  • 谨慎操作指针:
    • 在对指针进行解引用、赋值或算术运算前,检查其有效性。
  • 相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论