C++ 一种在设定的时间段后自动删除动态分配对象的方法

C++ 一种在设定的时间段后自动删除动态分配对象的方法,c++,C++,我正在寻找一些建议,让我正在处理的特定类的所有对象(我们称之为类a)在一段固定的时间后自动“自毁”。为了便于讨论,我们假设正好在3天后 我们保证 类A将仅在上创建 堆 还保证不存在任何对象 将永远访问A级的 创建后数小时(因此 在3天后删除对象是错误的 完全安全) [这些对象可能会被客户端代码多次访问长达72小时。而客户端代码确实可以调用destroy())类的每个对象上的方法。当它知道已使用它时,我不希望依赖客户端清理这些对象。为了避免可能的内存泄漏,我希望确保在没有客户端干预的情况下清理

我正在寻找一些建议,让我正在处理的特定类的所有对象(我们称之为类a)在一段固定的时间后自动“自毁”。为了便于讨论,我们假设正好在3天后

  • 我们保证 类A将仅在上创建 堆
  • 还保证不存在任何对象 将永远访问A级的 创建后数小时(因此 在3天后删除对象是错误的 完全安全)
[这些对象可能会被客户端代码多次访问长达72小时。而客户端代码确实可以调用destroy())类的每个对象上的方法。当它知道已使用它时,我不希望依赖客户端清理这些对象。为了避免可能的内存泄漏,我希望确保在没有客户端干预的情况下清理这些对象,即72小时后使其自毁。]


创建和忘记这些对象的推荐方法是什么?

一种方法是为所有这些对象创建一个“注册表”,并定期检查该“注册表”并删除太旧的对象。这可能是一个计时器过程、一个单独的线程或从客户机代码定期运行的某个例程。将对象地址添加到注册表时,会将添加时间与地址一起存储。当然,这些对象需要一些共同的基础来允许多态性破坏和解除分配。

< P>你应该真正地使用C++中的资源管理。就你而言,使用a可以解决您的问题。

我认为,如果您有类似于been的东西,并且对象成为none单例,将拒绝对其进行方法调用,那么变为none的过程将由一个资源池管理,该资源池将保留对每个对象及其创建时间的引用,以及当对象超过3天时的引用它会变成none

也许你可以在你的类中实例化一个
静态std::list
。该类的每个新实例都被推到该列表的后面,计时器会定期调用一个函数,当列表前面的项目太旧时,该函数会弹出并销毁这些项目

注意,如果你想延长生命周期中某个特定实例的寿命,那么列表结构可能不好,因为你必须执行线性扫描…

在这种情况下,您需要一个容器,在容器中,您可以快速插入和删除两端,并在其中快速找到元素,中间有快速删除。我只能建议使用一个

静态std::map
,它允许您快速查找列表中的元素


否则,请阅读关于
shared\u ptr
s的答案。这是可以提供给你的最好建议。如果没有什么阻止您使用它,那么切换到它,不要实现我告诉您的。

我将实现一些简单的垃圾收集器系统,并通过它分配您的对象

假设对象本身不能交叉引用,这应该相当容易


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

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

我通常会使用LRU技术(最近使用最少),最好的容器是std::list。当访问某个项目时,您可以“拼接”列表以将该项目移动到前面。大多数情况下,您处理的是列表迭代器,即使在列表中移动,这些迭代器仍然有效

在不同的时候,你可以在你的清单上做一些“清理”。您可以有一个在一段时间内检查过期项目的流程,或者它可能是事件驱动的,并且知道下一个过期时间是什么时候


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

这个问题很疯狂,但很好。理论上,
共享\u ptr
也很好,但它会在不再引用对象时立即删除对象,而不是在一段时间后。也许某个对象仍会保留引用,但不再使用它。所以这个想法是+1,但它没有回答这个精确的问题。@Benoit:可能是,只是想指出所有选项。另外,我会考虑一个持有引用的对象,它肯定不会再使用一个设计缺陷。@ SuffeY0C0WB0Y:你完全正确地指向这个选项,因为赔率是OP将有它的使用,并采取你的解决方案。+ 1其他的答案处理问题,但这个答案解决问题的根源!谢谢,但是共享的ptr不会在这里减少它,因为贝诺特在上面指出了确切的原因;在给定的时间段后,它不会删除我的对象。谢谢,是的,这是此阶段的可选要求,重置计时器以延长对象的寿命。所以我想知道什么是计时器在这里使用的好选择?它需要是线程安全的,因为我的应用程序是多线程的(pthreads,HPUX 11),并且在任何给定的时间都会有多个线程创建我的类A的对象。很抱歉,在您编辑您的回复以包括共享的ptr之后,我失去了编辑上面的回复的窗口。自从