Распределитель памяти вызывает таинственную паузу - PullRequest
0 голосов
/ 17 февраля 2011

Я, наверное, должен спать.Вместо этого я кодирую.В частности, я написал «Распределитель памяти худшего в мире».У него есть массив байтов (символов), чтобы использовать его для памяти;у него есть список используемых блоков памяти;у него есть индекс для выделения памяти.Он даже выделяет память.Распределяет, не так много.
Это не должно быть проблемой, хотя, насколько мне известно, ничего нового не существует вне классов массива и списка, и деструктор для них называется правильным числомраз.

Редактировать: Проблема в том, что программа входит в то, что кажется бесконечным циклом где-то в самом внутреннем коде c ++, вскоре после вызова деструктора MemoryManager.Фактически, если 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 ]

1 голос
/ 17 февраля 2011

Вы, похоже, не задавали здесь вопрос, но я все равно укажу на ужасный недостаток в вашем подходе:)

Если вы планируете написать метод Deallocate(void*), тогда вы будете бороться. Вы можете сопоставить указатель void* со списком memBlocks, чтобы определить, какой это MemBlock, но вы сможете уменьшить index только в том случае, если этот MemBlock окажется последним, возвращенным Allocate в противном случае это просто свободная дыра в вашем массиве.

Для базового решения этого вопроса вам понадобится список свободных блоков, и вы возьмете выделенные блоки из этого списка и добавите их обратно в список, когда они были освобождены.

Этот подход называется свободным списком: http://en.wikipedia.org/wiki/Free_list

0 голосов
/ 18 февраля 2011

Решено - Ошибка в незнании;это была косвенная ошибка.Я использовал "Удалить theArray;"в деструкторе Array (Array также является базовым классом List), когда я должен был использовать «delete [] theArray».Пауза уже прошла, и проблема кажется решенной.Спасибо за ваше время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...