静态成员回收内存并从异常中恢复

时间:2011-10-20 08:39:14

标签: c++ exception operator-overloading new-operator

这是我的作业问题

  

使用自己的operator new创建一个类。这个运营商应该   分配5个对象,并在第5个'耗尽内存'并抛出一个   例外。还要添加一个可以回收此功能的静态成员函数   记忆。现在用try块和catch子句创建一个main()   调用内存恢复例程。将这些放入while循环中   证明从异常中恢复并继续执行。

现在我不想要这个程序,但我对这个问题很困惑。我可以处理新的运算符重载,但是根据要求我应该创建一个静态成员“release()”。如果我必须恢复捕获,我该如何恢复?我的意思是我应删除哪个对象。 或者我的release()原型是错的?

编辑:
此外,如果我必须删除,我可以删除5个对象中的哪一个?删除任何对象实际上是不正确的。我看不出恢复的方法。

4 个答案:

答案 0 :(得分:1)

听起来你需要类似你班级的静态地址列表。每当调用new时,都会将该内存块的地址存储在该列表中。然后在你的发布方法中,你将浏览静态列表并释放内存并抛出异常。

答案 1 :(得分:0)

这是一项奇怪的任务。如果我理解这一点,你必须存储operator newrelease()函数可以找到的对象的地址。

答案 2 :(得分:0)

我对这个问题的解释是,你班级中new运算符的实现应该跟踪获得的内存,以便你的release方法(我会使用相同的签名),可以回收存储器中。

这种方法用于某些世代垃圾收集器,其中每一代内存都是从池中获取的,一旦生成完成后,单个调用将释放所有内存,避免碎片和管理空闲列表的成本(分配器可以在池内提供增加的地址,解除分配器只是忽略池中的数据)请注意,这种特定类型的池可以是高效的,但它的使用仅限于POD类型。

答案 3 :(得分:0)

静态成员应该分配一个release和reclaim方法。

struct AllocatorPool
{
     char*  allocate(size_t size);
     void   deallocate(char* ptr);

     void   reclaimPool();

     // Other stuff to handle memory management.
};

class T
{
      static  AllocatorPool    memoryForOjectsOfTypeT;


     // You new method here that gets memory from `memoryForOjectsOfTypeT`
};