【发布时间】:2013-10-04 06:36:48
【问题描述】:
我有一个类将weak_ptr 存储在容器中,如果weak_ptr 未过期,稍后会执行一些操作:
class Example
{
public:
void fill(std::shared_ptr<int> thing)
{
member.push_back(thing);
}
void dosomething() const
{
for (const auto& i : member)
if (!i.expired())
;// do something. the weak_ptr will not be locked
}
private:
std::vector<std::weak_ptr<int>> member;
};
如果Example 是一个永远存在的对象并且fill 被定期使用,则向量会连续为元素分配内存,但它们在过期后永远不会被删除。
是否有任何自动的 C++ 方法来摆脱容器中过期的weak_ptrs,或者是否有更好的方法来存储可变数量的它们?
我幼稚的方法是每次调用fill 时遍历容器并删除所有过期的weak_ptrs。在Example 在容器中有很多元素并且经常调用填充的情况下,这似乎非常低效。
【问题讨论】:
-
您可以为原始
shared_ptr使用自定义删除器,该删除器引用Example对象并删除它将要删除的指针(如果它在其中)。这样,您甚至不需要存储weak_ptr。 -
@Xeo 也许我把我的例子简化得太多了。实际上,容器是一个将weak_ptr 与某物相关联的映射。
Example类需要知道哪些对象何时过期以及哪些对象过期。 -
天真的方法可能没有你想的那么糟糕。如果您的指针经常过期,并且在添加新指针之前检查并清除了
fill中的指针,您可能会阻止向量重新分配,因为您刚刚为要添加的指针腾出了空间。编辑:刚刚看到你的评论;如果容器是地图,我所说的不适用。此外,无论容器是什么类型,@Xeo 所说的都有效。客户删除器只需要能够通过容器查看它是否包含即将被删除的指针的副本。 -
将第二行
if(member.size()%N==0)cleanup();添加到fill()并且仅在每 N 次调用时清理一次? -
@typ1232:你打算用过期的物品做什么?此外,删除器可以准确地告诉
Example对象 - 甚至准确地告诉对象已过期!