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

时间:2011-02-17 11:52:56

标签: c++ memory-management

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

编辑:问题是,在调用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;
    }
};

感谢。

2 个答案:

答案 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;。暂停现在已经消失,问题似乎已经解决了。谢谢你的时间。