C++中如何处理指针重复删除问题

问题描述 投票:0回答:1

最近我陷入了一个场景,在项目中同时使用原始指针和智能指针。

我有两节课。 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类。

c++ c++11 pointers memory-management smart-pointers
1个回答
0
投票

正如评论中指出的,这里的关键点是

在渲染函数中创建和删除。

您似乎误解了所有权的含义。拥有一些资源意味着有责任在不再需要时清理它。如果渲染函数删除了

CanvasItem
,则其他人不得删除它们。渲染器拥有它们,其他人不得拥有它们。

原始拥有指针很困难。不拥有原始指针是可以的。如果实际资源由

shared_ptr
管理,您应该更喜欢
weak_ptr
作为观察者。

void Canvas::Add(CanvasItem* item) {
   m_canvasItems.push_back(item); // Do not moves ownership !
}

画布仅存储一个原始指针来访问

CanvasItem
。您必须确保当
CanvasItem
正在访问它时,
Canvas
仍处于活动状态。

© www.soinside.com 2019 - 2024. All rights reserved.