这是我的作业问题
使用自己的operator new创建一个类。这个运营商应该 分配5个对象,并在第5个'耗尽内存'并抛出一个 例外。还要添加一个可以回收此功能的静态成员函数 记忆。现在用try块和catch子句创建一个main() 调用内存恢复例程。将这些放入while循环中 证明从异常中恢复并继续执行。
现在我不想要这个程序,但我对这个问题很困惑。我可以处理新的运算符重载,但是根据要求我应该创建一个静态成员“release()”。如果我必须恢复捕获,我该如何恢复?我的意思是我应删除哪个对象。 或者我的release()原型是错的?
编辑:
此外,如果我必须删除,我可以删除5个对象中的哪一个?删除任何对象实际上是不正确的。我看不出恢复的方法。
答案 0 :(得分:1)
听起来你需要类似你班级的静态地址列表。每当调用new时,都会将该内存块的地址存储在该列表中。然后在你的发布方法中,你将浏览静态列表并释放内存并抛出异常。
答案 1 :(得分:0)
这是一项奇怪的任务。如果我理解这一点,你必须存储operator new
内release()
函数可以找到的对象的地址。
答案 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`
};