可靠地确保C++ 14 中的内存安全
Reliably Ensure Memory Safety in C++ 14
我正在转换一些旧的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 字段只能在构造时分配,因此这可确保对象只能包含指向之前创建的对象的共享指针。 (好的,有办法解决这个问题,但你不会错误地这样做)
由于"之前创建"是完全排序,因此可以确保共享指针的图形是非循环的。
- C++ Python 的扩展 - 安全内存访问和内存布局
- CIN内存安全
- 访问"std::vector"的保留但未调整大小的内存作为原始内存是否安全?
- 带有此指针的内存安全吗?
- 在不同的内存位置同时写入 std::d eque 是否线程安全?
- 如何在没有动态内存分配(堆)的情况下为可变大小数组(矢量)定义安全容器或视图
- 将类复制到未初始化的内存中是否安全?
- 我致电CuctxDestroy后,重复使用CumeMalloc内存是安全的吗?
- 如何在<N>不发生内存泄漏的情况下同时(线程安全)填充 c++11 std::map<std::string,std::bitset*>?
- 使用安全零内存新建/删除时出现问题
- 在不隔离内存的情况下使用新的位置是安全的吗?
- 可靠地确保C++ 14 中的内存安全
- 从函数安全返回和处理动态分配的内存,C++ 11
- 在释放内存之前,请始终重新分配内存 - C 是安全的吗?
- C++多线程:线程安全的内存分配
- 如何从C或C 语言级别安全访问内存映射的硬件寄存器
- 用于读取输入文件的内存映射文件的安全
- C++以内存安全的方式使用给定向量的大小创建2D阵列
- 向量的向量是内存安全的吗?
- free()方法分配的内存安全吗?