代码之家  ›  专栏  ›  技术社区  ›  Chenna V

悬空参考。悬空指针和引用的替代方案?

  •  9
  • Chenna V  · 技术社区  · 15 年前

    以下代码生成悬挂引用:

    int main()
    {
      int *myArray = new int[2]{ 100, 200 };
      int &ref = myArray[0];
      delete[] myArray;
      cout << ref;  // Use of dangling reference.
    }
    

    我知道我不应该删除数组,但是在一个大型程序中,如果有人删除了我有引用的内存怎么办?是否可以确定没有人删除数组?

    针对悬空引用和悬空指针的最佳策略是什么?

    5 回复  |  直到 9 年前
        1
  •  14
  •   Steve Townsend    15 年前

    在完成之前不要删除内存。

    听起来很蠢,但这是你唯一的保护-正确理解谁拥有每个变量后面的内存,以及何时可以安全地释放内存。

    智能指针可以提供帮助,但以上仍然适用。

    一些静态分析工具可能会识别出你在这里遇到的微不足道的情况,但即便如此,这也应该是第二道防线,你的第一道防线就是内存管理。

        2
  •  7
  •   John Dibling    15 年前

    保持适当的范围:

    int main(){
      int *myArray;
      myArray = new int[2]{ 100, 200 };
      {
        int& ref = myArray[0];
        // use the ref here
        cout<<ref;  \\no longer a dangling reference
      } // ref falls out of scope here
      delete[] myArray;
     }
    
        3
  •  5
  •   BЈовић    15 年前

    病人:医生,我这样做的时候很疼 这个。。。

    医生:那就别做了。。。

    引用内存时不要释放内存。


    编辑

    唯一的方法就是调试,进行良好的单元测试并在valgrind下运行,或者在valgrind下运行程序。

        4
  •  4
  •   Trevor Hickey    10 年前

    这里所有的答案都是“小心!”,以及“使用良好的编程实践!”.
    这不是一个很令人满意的答案。这些问题在C中已经存在了40多年,它们在任何显著大小的C++项目中仍然是常见的。

    你将听到人们推荐的最大准则是:

    • 使用智能指针
    • 使用RAII

    两者都是对的,但你还可以做更多的事。

    2015,标准C++基金会发布了 Guidelines Support Library .

    您可以编写静态类型安全的C++程序。 资源泄漏。你可以在不损失性能的情况下 不限制C++语言的表达能力。此模型用于类型-和 资源安全C++已经使用ISO的组合实现了。 标准C++语言设施、静态分析和微小支持 图书馆(用ISO标准C++编写)。

    我建议你用GSL的 Owner<> 使用静态分析工具。
    这将保证安全行为。

        5
  •  3
  •   Mike Caron    15 年前

    良好的编程实践。编译器给了你足够多的绳子来吊死自己;你有责任确保你没有吊死自己。

    换句话说,如果不引用数组,然后删除它,就不会有问题。

    “但是,万一发生了呢?”

    没有简单的答案,真的。这都是关于训练,以及知道如何使用你想要使用的工具。