可靠地确保 C++ 14 中的内存安全
Reliably Ensure Memory Safety in C++ 14
我正在将一些旧的 C++ 代码转换为使用 shared_ptr、unique_ptr 和 weak_ptr,并且我将 运行 保留为设计问题。
我有 "generator" 方法 return 新对象,以及 return 指向现有对象的访问器方法。乍一看,解决方案似乎很简单; return shared_ptr 用于新对象,weak_ptr 用于访问器。
shared_ptr 完全避免了悬挂指针,因为如果对象被删除,它的所有共享指针和弱指针都会知道它。但是我将 运行 保留在我不确定我的共享指针之间是否存在循环引用的情况下。有很多类,其中一些相互指向;有没有可能在某个时候形成一个循环?代码非常复杂,很难分辨 - 新的 类 是根据脚本文件中的指令创建的。所以我不知道shared_ptr是否真的在防止内存泄漏并且一直在手动删除所有对象,这似乎违背了重点。
我考虑过使用 unique_ptr,因为我实际上不需要在任何地方共享所有权。 (旧的 C++ 代码当然没有任何共享所有权,它只是原始指针。)但我不能从 unique_ptr 生成 weak_ptr,所以我必须使用原始指针作为标准用于弱指针的 ins。这解决了内存泄漏问题,但是当 unique_ptr 被销毁时,我可能会留下悬空指针。
看来我可以有一个或另一个:防弹内存泄漏预防或防弹悬挂指针预防,但不能两者兼而有之。
人们告诉我,我需要将整个程序结构牢记在心,这样我才能验证没有共享指针循环,但这似乎很容易出错。毕竟,我的头只有这么大。 有没有办法在只考虑本地代码的情况下实现内存安全?
对我来说,这是 OO 编程的核心要素,在这种情况下我似乎失去了它。
可能对您有用的策略是确保所有托管对象中的所有共享指针都是 const
。
由于 const shared_ptr 字段只能在构造时赋值,这确保对象只能持有指向在之前创建的对象的共享指针是。 (好吧,有很多方法可以解决这个问题,但你不会错误地做到这一点)
由于"created before"是全序,这确保了共享指针图是非循环的。
我正在将一些旧的 C++ 代码转换为使用 shared_ptr、unique_ptr 和 weak_ptr,并且我将 运行 保留为设计问题。
我有 "generator" 方法 return 新对象,以及 return 指向现有对象的访问器方法。乍一看,解决方案似乎很简单; return shared_ptr 用于新对象,weak_ptr 用于访问器。
shared_ptr 完全避免了悬挂指针,因为如果对象被删除,它的所有共享指针和弱指针都会知道它。但是我将 运行 保留在我不确定我的共享指针之间是否存在循环引用的情况下。有很多类,其中一些相互指向;有没有可能在某个时候形成一个循环?代码非常复杂,很难分辨 - 新的 类 是根据脚本文件中的指令创建的。所以我不知道shared_ptr是否真的在防止内存泄漏并且一直在手动删除所有对象,这似乎违背了重点。
我考虑过使用 unique_ptr,因为我实际上不需要在任何地方共享所有权。 (旧的 C++ 代码当然没有任何共享所有权,它只是原始指针。)但我不能从 unique_ptr 生成 weak_ptr,所以我必须使用原始指针作为标准用于弱指针的 ins。这解决了内存泄漏问题,但是当 unique_ptr 被销毁时,我可能会留下悬空指针。
看来我可以有一个或另一个:防弹内存泄漏预防或防弹悬挂指针预防,但不能两者兼而有之。
人们告诉我,我需要将整个程序结构牢记在心,这样我才能验证没有共享指针循环,但这似乎很容易出错。毕竟,我的头只有这么大。 有没有办法在只考虑本地代码的情况下实现内存安全?
对我来说,这是 OO 编程的核心要素,在这种情况下我似乎失去了它。
可能对您有用的策略是确保所有托管对象中的所有共享指针都是 const
。
由于 const shared_ptr 字段只能在构造时赋值,这确保对象只能持有指向在之前创建的对象的共享指针是。 (好吧,有很多方法可以解决这个问题,但你不会错误地做到这一点)
由于"created before"是全序,这确保了共享指针图是非循环的。