以下代码生成悬空引用:
int main()
{
int *myArray = new int[2]{ 100, 200 };
int &ref = myArray[0];
delete[] myArray;
cout << ref; // Use of dangling reference.
}
我知道我不应该删除数组但是在一个大程序中如果有人删除了我有引用的内存怎么办?是否可以确保没有人删除数组?
对付悬空引用和悬空指针的最佳策略是什么?
答案 0 :(得分:13)
在完成内存之前,请勿删除内存。
听起来很愚蠢,但这是你唯一的保护 - 正确理解谁拥有每个变量背后的内存,以及何时可以安全地释放它。
智能指针可以提供帮助,但上述内容仍然适用。
有些静态分析工具可以识别你在这里遇到的琐碎案例,但即便如此,这应该是第二道防线,你的第一道就是内存管理专业。
答案 1 :(得分: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;
}
答案 2 :(得分:5)
病人:医生,我这样疼 此... 医生:然后停止这样做......
在引用内存时不要释放内存。
修改
捕获它的唯一方法是调试,进行良好的单元测试并在valgrind下运行,或者在valgrind下运行程序。
答案 3 :(得分:4)
这里的所有答案都是&#34;小心!&#34;和&#34;使用良好的编程习惯!&#34;。
这不是一个非常令人满意的答案。这些问题已经在C中存在了40多年,并且它们在任何相当大的C ++项目中仍然很常见。
您会听到人们推荐的最大准则是:
两者都是真的,但你可以做得更多。
2015年,标准C ++基金会发布了Guidelines Support Library。
您可以编写静态类型安全但没有的C ++程序 资源泄漏。你可以做到这一点而不会损失性能和 不限制C ++的表现力。这种型号的类型和 资源安全的C ++已经使用ISO的组合实现 标准C ++语言工具,静态分析和微小支持 库(用ISO标准C ++编写)。
我建议您使用GSL&#39; Owner<>
和静态分析工具
这将保证安全行为。
答案 4 :(得分:3)
良好的编程习惯。编译器为您提供了足够的绳索来吊死自己;你有责任确保不这样做。
换句话说,如果你没有引用数组,然后删除它,那么你就不会有问题。
“但是,如果它发生了怎么办?”
真的没有简单的答案。这一切都与培训有关,并且知道如何使用您尝试使用的工具。