gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:20:51 24 4
gpt4 key购买 nike

我曾在这里寻求有关此问题的帮助 Static member reclaiming memory and recovering from an exception

下面的程序是使用自己的 new 运算符分配内存。我必须在第 5 个对象分配时抛出异常并通过释放内存来恢复(我知道这个问题很奇怪,但它是赋值)

我在这里写了代码。分配有效,但是当我尝试调用删除(通过选项“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 block 没有捕获异常。分配 5 个对象后抛出异常(通过调试器跟踪)但未捕获。代码中的新更改不会影响相关代​​码。

最佳答案

死循环的发生是因为在object::operator delete()之前调用了析构函数(~object())。您的析构函数正在尝试删除最近分配的对象,该对象在同一对象上调用析构函数。 operator delete() 永远不会被调用。

我不确定 allocatedObjects 在这里实现了什么,代码在没有它的情况下也能正常工作。也去掉 release ()

更新

OK,所以需要发布(异常处理)。

不要从析构函数中调用释放。相反,在调用 free 之后,让 operator delete() 函数将 allocatedObjects 条目设置为 0(镜像 operator new( ))。 release() 函数仅在异常处理期间调用,并确保正确释放未释放的内存(即循环遍历 allocatedObjects 数组和 free非零条目,然后将它们设置为零。

关于c++ - 在释放内存时陷入无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7850374/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com