最近我陷入了一个场景,在项目中同时使用原始指针和智能指针。
我有两节课。 Canvas里面又组成了另一个类CanvasItem。它将 CanvasItem 指针存储在 std::unique_ptr m_canvasItems.
的向量中。类有方法
void Canvas::Add(CanvasItem* item) {
m_canvasItems.push_back(std::unique_ptr<CanvasItem>(item)); //Moves ownership of CanvasItem pointer to Canvas class
}
现在在我的 main.cpp 文件中,我有 CanvasItems 的原始指针。它们是在渲染函数中创建和删除的。在 render 方法中,创建 CanvasItem 指针,然后将其添加到 Canvas 中的 m_canvasItems 向量中。
现在,当我运行内存测试时,它会抛出错误,指出资源被重复删除。这是可以理解的,因为指针已经被 Canvas 类删除了。
任何人都可以建议我解决方法,以便我以某种方式撤销 Canvas 类中这些指针的所有权,这样清理工作就由主类完成。我找到了这个链接,但我不知道这是否是我要找的。
注意:我无法更改 main.cpp 中的任何逻辑,因此它必须保持不变。
我负责Canvas和CanvasItem类。
正如评论中指出的,这里的关键点是
在渲染函数中创建和删除。
您似乎误解了所有权的含义。拥有一些资源意味着有责任在不再需要时清理它。如果渲染函数删除了
CanvasItem
,则其他人不得删除它们。渲染器拥有它们,其他人不得拥有它们。
原始拥有指针很困难。不拥有原始指针是可以的。如果实际资源由
shared_ptr
管理,您应该更喜欢 weak_ptr
作为观察者。
void Canvas::Add(CanvasItem* item) {
m_canvasItems.push_back(item); // Do not moves ownership !
}
画布仅存储一个原始指针来访问
CanvasItem
。您必须确保当 CanvasItem
正在访问它时,Canvas
仍处于活动状态。