0

我正在写一个简单的内存管理器。我正在尝试简化此功能,以便其他人可以将他们想要分配的对象添加为第一个参数。内存管理器将为该对象分配空间,并将对象的指针设置为指向分配的空间。问题是我不确定如何制作参数,因此几乎可以传入任何类型的对象,而不必像疯了一样将其转换为使其工作。

这是功能:

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);

任何帮助或指导将不胜感激!:)

4

1 回答 1

1

使用模板和重载,你可以直接对 的类型进行操作data,包括它的大小:

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

但是,当涉及到数组时,通常我们会尝试避开 C++ 中的指针。使用vector<T>例如。您可以指定自己的分配器。

我会考虑你是否真的想返回一个原始指针;您可能会考虑返回一个智能指针对象。

您的数组大小计算有缺陷;我不太确定你想在那里做什么。我希望这allocSize真的是元素大小,因此计算是:

allocSize = (allocSize * elementCount);

但是您无法知道用户请求了多少元素。

于 2013-06-09T18:08:09.093 回答