在一段时间后自动删除动态分配对象的方法

时间:2011-03-04 07:45:13

标签: c++

我正在寻找建议让我正在处理的特定类的所有对象(让我们称之为A类)在一段固定的时间后自动“自毁”。为了争论,让我们说完3天后。

  • 保证所有对象 A类只会在上面创建 堆。
  • 也保证没有对象 A级将被访问72 创建后几个小时(所以 3天后删除对象是 完全安全的。)

[客户端代码可能会多次访问这些对象,最长可达72小时。虽然客户端代码确实可以在类A的每个对象上使用它时知道它完成时调用destroy()方法,但我不想依赖客户端清理这些对象。为了避免可能的内存泄漏,我想确保在没有客户干预的情况下清理它们,即72小时后它们会自毁。]

这样做的建议方法是什么?创造 - 忘记?

6 个答案:

答案 0 :(得分:3)

一种方法是为所有这些对象设置一个“注册表”,并定期检查“注册表”并删除太旧的对象。这可能是一个计时器过程或一个单独的线程或一些例程定期从客户端代码运行。将对象地址添加到注册表时,可以存储添加时间和地址。当然,这些对象需要一些共同的基础来允许多态破坏和释放。

答案 1 :(得分:3)

您应该在C ++中使用RAII进行资源管理。在您的情况下,使用boost::shared_ptr可以解决您的问题。

答案 2 :(得分:2)

如果在一段时间内未使用,您可能希望实现它们过期。这在客户端/服务器技术中很常见,您可以在其中缓存客户端正在使用的项目,以便在请求它们时它们随时可用,并且这是一种无连接服务器的技术,其中客户端具有请求对象并使用它们的会话,所以没有它这不是一个疯狂的问题,它有实际的好处。

我通常会发现我会使用LRU技术(最近最少使用),最好的容器是std :: list。访问某个项目时,您可以“拼接”您的列表以将项目移动到前面。很多时候你处理list-iterators,即使在列表中移动它们仍然有效。

您可以在不同时间对列表进行“清理”。您可以使用一个流程来检查过期项目的一段时间,或者它可能是事件驱动的,并知道下一个到期时间。

当然,如果客户端回来并尝试访问该项目,您必须准备好在删除时的状态下重新创建它。

答案 3 :(得分:1)

也许您可以在班级中实例化static std::list<Your_class *>。该类的每个新实例都被推送到该列表的后面,并且计时器定期调用一个函数,该函数在它们太旧时弹出并销毁列表前面的项目。

请注意,如果您希望延长特定实例的生命周期,那么列表结构可能不太好,因为您必须执行线性扫描......

在这种情况下,您需要一个容器,您可以在其中快速插入并在两端移除,并且您可以在其中快速找到元素,并在其中间快速删除。我只能建议使用static std::map<Your_class *, std::list<Your_class *>::iterator>,以便您快速查找列表中的元素。

否则请阅读有关shared_ptr的答案。这是可以提供给您的最佳建议。如果没有什么可以阻止你使用它,那么切换到它并且不实现我告诉你的。

答案 4 :(得分:0)

我认为如果你有类似的东西,并且让对象成为一个无单例,拒绝对它的方法调用,成为none的过程将由资源池管理,该资源池将保持对每个对象的引用和时间它被创建,当对象超过3天时,它将变为无

答案 5 :(得分:0)

我会实现一些简单的垃圾收集器系统并通过它分配你的对象。

假设对象不能交叉引用自己,那应该相当容易。

例如,垃圾收集器类可以包含一个包含对象指针的双端队列(例如std::deque)及其创建时间。创建新对象时,它们将放在队列的末尾。我会不时调用一个函数purge(),它将检查位于队列前面的对象(最旧的)并在适用时删除它们。