晃来晃去参考.悬挂指针和参考的替代方案?

blu*_*kin 10 c++ pointers reference

以下代码生成悬空引用:

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

我知道我不应该删除的磁盘阵列,但在一个大的程序,如果有人有什么删除记忆,而我有一个参考?它可以以某种方式确保没有人删除阵列吗?

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

Ste*_*end 14

完成之前不要删除内存.

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

智能指针可以提供帮助,但上述内容仍然适用.

有些静态分析工具可以识别你在这里遇到的琐碎案例,但即便如此,这应该是第二道防线,你的第一道就是内存管理学科.

  • @blueskin:我很确定即使使用智能指针,没有纪律的程序员仍然可以搞砸(例如,通过将普通指针存储到所保持的对象).即使有智能指针,您也必须遵循最佳实践. - 尽管如此,把事情弄清楚会更简单. (2认同)

Joh*_*ing 7

保持它们的范围正确:

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;
 }
Run Code Online (Sandbox Code Playgroud)


BЈо*_*вић 5

病人:医生,我这样做会很痛...

医生:那就别做...

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


编辑

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