在释放内存时陷入无限循环
stuck in infinite loop in deallocating memory
我在这里问过这个问题的帮助静态成员回收内存和从异常中恢复
下面的程序是使用自己的new操作符分配内存。我必须抛出异常在第5对象分配和恢复通过释放内存(奇怪的问题,我知道,但它是分配)
我在这里写了代码。分配工作,但当我试图调用delete(通过选项'2'),我陷入无限循环。
#include <iostream>
#include <cstdlib>
using namespace std;
class object
{
int data;
static int count;
static void* allocatedObjects[5];
public:
object() { }
void* operator new(size_t);
void operator delete(void *);
void static release();
void static printCount()
{
cout << count << 'n';
}
~object()
{
release();
}
};
int object::count = 0;
void* object::allocatedObjects[5];
void* object::operator new(size_t size)
{
if (count > 5)
throw "Cannot allocate more than 5 objects!n";
void *p = malloc(size);
allocatedObjects[count] = p;
count++;
return p;
}
void object::operator delete(void *p)
{
free(p);
count--;
}
void object::release()
{
while (count > 0)
{
delete static_cast<object*> (allocatedObjects[count]);
}
}
int main()
{
object *o[10];
int i = -1;
char c = 1;
while (c != '3')
{
cout << "Number of objects currently allocated : ";
object::printCount();
cout << "1. Allocate memory for object.n";
cout << "2. Deallocate memory of last object.n";
cout << "3. Exit.n";
cin >> c;
if (c == '1')
{
try
{
i++;
o[i] = new object;
}
catch (char* e)
{
cout <<e;
object::release();
i = 0;
}
}
else if (c == '2' && i >= 0)
{
delete o[i];
i--;
}
}
return 0;
}
我做错了什么?
编辑我已经修复了删除问题。通过去掉析构函数。并显式地在main语句末尾调用release。
但是现在我的catch块没有捕获异常。分配5个对象后抛出异常(通过调试器跟踪),但未捕获。新的代码变更不影响相关代码
发生无限循环是因为析构函数(~object()
)在object::operator delete()
之前被调用。析构函数试图删除最近分配的对象,这将调用同一对象上的析构函数。未调用operator delete()
我不确定allocatedObjects
在这里实现什么,没有它代码将工作。把release ()
也去掉。
好的,所以需要release(异常处理)。
不要从析构函数中调用release。相反,让operator delete()
函数在调用free
之后将allocatedObjects
条目设置为0(镜像operator new()
)。release()
函数只在异常处理期间调用,并确保未释放的内存被正确释放(即循环通过allocatedObjects
数组和free
非零条目,然后将它们设置为零)。
相关文章:
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 从文件 C++ 读取时的无限循环
- 在释放内存时陷入无限循环