2013-06-09 3 views
0

Я пишу простой диспетчер памяти. Я пытаюсь упростить эту функцию, чтобы другие моглипросто добавить объект, который они хотят выделить в качестве первого параметра. Диспетчер памяти будет выделить пространство для этого объекта и установить указатель объекта на выделенное пространство . Проблема в том, что я не уверен, как это сделать, так что примерно любой тип объекта может быть передан, без необходимости использовать его как сумасшедший, чтобы заставить его работать.Передача объектов в функцию с помощью указателя void

Вот функция:

bool MemoryManager::Allocate(void** data, unsigned int allocSize, bool isArray) 
{ 
    if((m_Heap.m_Pool == nullptr) || (*data != NULL)) 
     return false; 

    if(isArray) 
     allocSize += sizeof(unsigned int) * 4; 

    void* mem = m_Heap.Allocate(allocSize); 
    if(mem) 
    { 
     *data = mem; 
     return true; 
    } 
    else 
     return false; 
} 

Это в настоящее время, как я должен назвать его, чтобы заставить его работать:

int* Test = NULL; 
MemoryManager::GetInstance()->Allocate((void**)(&Test), sizeof(int), false); 

Любая помощь или руководство будет весьма признателен ! :)

+1

Используйте шаблон и передайте его по ссылке? – chris

ответ

1

Использование шаблонов и перегрузки, вы можете работать непосредственно от типа data, включая его размер:

template<typename T> 
bool MemoryManager::Allocate(T*& data) 
{ 
    size_t allocSize = sizeof(T); 
    ... 
} 

Когда дело доходит до массивов, хотя, как правило, мы стараемся держаться подальше от указателей в C++. Например, используйте vector<T>. Вы можете указать свой распределитель.

Я бы подумал, действительно ли вы хотите вернуть необработанный указатель; вы можете подумать о возврате объекта интеллектуального указателя.

Исчерпан расчет размера массива; Я не совсем уверен, что вы пытаетесь сделать там. Я бы ожидать, что allocSize действительно размер элемента, и, таким образом, расчет:

allocSize = (allocSize * elementCount); 

Но у вас нет никакого способа узнать, сколько элементов запрашивает пользователь.