gpt4 book ai didi

c++ - 导致神秘暂停的内存分配器

转载 作者:行者123 更新时间:2023-11-28 08:23:15 24 4
gpt4 key购买 nike

我应该在 sleep 。相反,我正在编码。具体来说,我编写了 The World's Worse Memory Allocator(TM)。它有一个字节数组(字符)用于存储东西;它有一个已用内存块的列表;它有一个索引来分配内存。它甚至分配内存。解除分配,没那么多。
不过,据我所知,这应该不是问题,在数组和列表类之外没有任何新内容,并且这些类的析构函数被调用了适当的次数。

编辑:问题是,在调用 MemoryManager 的析构函数后不久,程序在 c++ 后端代码本身的某处进入了一个似乎是无限循环的地方。事实上,如果将 MemoryManager 放在 Try-Catch block 内,程序永远不会使其超出 Try-Catch block 。我需要知道为什么以及如何解决它,谢谢。

这是执行非常重要分配的主循环:

int _tmain(int argc, _TCHAR* argv[])  
{
MemoryManager memoryManager = MemoryManager(1024);

try
{

int * n;
for (int t = 0; t < 32; ++t)
{
n = (int*)memoryManager.Allocate(4);
}
} catch (char* str) { std::cout << str; }

return 0;
}

还有 MemoryManager,它是新手的荣耀:

// A memory manager

#pragma once

#include "stdafx.h"

#include "Array.h"
#include "SmartPointer.h"


class MemBlock
{
public:
unsigned int Start;
unsigned int End;

MemBlock() { Start = 0; End = 0; }

MemBlock(unsigned int start, unsigned int end)
{
Start = start; End = end;
}
~MemBlock() { }
};


class MemoryManager
{
private:
Array<char> memory;
List<MemBlock> memBlocks;
int index;

public:
MemoryManager(unsigned int size)
{
memory = Array<char>(size);
memBlocks = List<MemBlock>(size / 24);
index = 0;
}
~MemoryManager() { }


void* Allocate(unsigned int size)
{
memBlocks.Add(&MemBlock(index, index + size));
void* r = (void*)(memory.insecureAccess + index);
index += size;
return r;
}
};

谢谢。

最佳答案

你似乎没有在这里问过问题,但我还是要指出你方法中的一个可怕缺陷:)

如果您打算编写一个Deallocate(void*) 方法,那么您将会遇到困难。您可以将 void* 指针与您的 memBlocks 列表进行匹配以确定它是哪个 MemBlock,但您只能减少 index 如果 MemBlock 恰好是 Allocate 返回的最后一个,否则它只是数组中的一个空洞。

对于这个问题的基本解决方案,您需要一个空闲 block 列表,您将从该列表中获取分配的 block ,并在它们被释放时将它们添加回列表。

这种方法称为空闲列表:http://en.wikipedia.org/wiki/Free_list

关于c++ - 导致神秘暂停的内存分配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5028571/

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