在释放内存时陷入无限循环

stuck in infinite loop in deallocating memory

本文关键字:无限循环 释放 内存      更新时间:2023-10-16

我在这里问过这个问题的帮助静态成员回收内存和从异常中恢复

下面的程序是使用自己的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非零条目,然后将它们设置为零)。