可靠地确保C++ 14 中的内存安全

Reliably Ensure Memory Safety in C++ 14

本文关键字:内存 安全 C++ 确保      更新时间:2023-10-16

我正在转换一些旧的C++代码以使用shared_ptr,unique_ptr和weak_ptr,但我不断遇到设计问题。

我有返回新对象的"生成器"方法,以及返回指向现有对象的指针的访问器方法。乍一看,解决方案似乎很简单;为新对象返回shared_ptr,为访问器返回weak_ptr。

shared_ptr完全避免了悬空指针,因为如果对象被删除,其所有共享和弱指针都知道它。但是我一直遇到不确定我的共享指针中是否存在循环引用的情况。有许多类,其中一些相互指向;有没有可能在某个时候形成一个周期?代码非常复杂,很难分辨 - 新类是根据脚本文件中的指令创建的。所以我不知道shared_ptr是否真的在防止内存泄漏并一直在手动删除所有对象,这似乎违背了重点。

我考虑改用unique_ptr,因为我实际上不需要任何地方共享所有权。(旧的C++代码当然没有任何共享所有权,它只是原始指针。但是我无法从unique_ptr进行weak_ptrs,所以我必须使用原始指针作为弱指针的替身。这解决了内存泄漏问题,但是当unique_ptr被破坏时,我可能会留下悬空的指针。

所以似乎我可以有一个或另一个:防弹内存泄漏预防或防弹悬空指针预防,但不能两者兼而有之。

人们告诉我,我需要在脑海中保留整个程序结构,以便我可以验证没有共享指针循环,但这似乎容易出错。毕竟,我的头只有这么大。有没有办法在只需要考虑本地代码的情况下实现内存安全?

对我来说,这是OO编程的核心,在这种情况下,我似乎失去了它。

可能适合您的策略是确保所有托管对象中的所有共享指针都const

由于 const shared_ptr 字段只能在构造时分配,因此这可确保对象只能包含指向之前创建的对象的共享指针。 (好的,有办法解决这个问题,但你不会错误地这样做)

由于"之前创建"是完全排序,因此可以确保共享指针的图形是非循环的。