编辑:问题是,在调用MemoryManager的析构函数后不久,程序就会在c ++后端代码本身的某处进入无限循环。事实上,如果MemoryManager放在Try-Catch块中,程序永远不会在Try-Catch块之外。我需要知道为什么以及如何解决它,谢谢。
这是执行非常重要的分配的主循环:
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;
}
};
感谢。
答案 0 :(得分:1)
你似乎没有在这里问过一个问题,但我会指出你的方法中存在一个可怕的缺陷:)
如果您打算编写Deallocate(void*)
方法,那么您将会挣扎。
您可以将void*
指针与memBlocks
列表进行匹配,以确定它是MemBlock
,但只有在index
发生MemBlock
时您才能减少Allocate
是{{1}}返回的最后一个,否则它只是阵列中的一个自由洞。
对于此基本解决方案,您需要一个空闲块列表,您将从该列表中获取已分配的块,并在取消分配时将它们添加回列表。
此方法称为免费列表:http://en.wikipedia.org/wiki/Free_list
答案 1 :(得分:0)
解决 - 无知错误;这是间接错误。我正在使用&#34;删除阵列;&#34;在数组析构函数(数组也是List的基类)中我应该使用&#34; delete [] theArray&#34;。暂停现在已经消失,问题似乎已经解决了。谢谢你的时间。