通过void指针将对象传递给函数

时间:2013-06-09 17:56:47

标签: c++ memory-management parameters casting void-pointers

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

以下是功能:

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 个答案:

答案 0 :(得分:1)

使用模板和重载,您可以直接操作data的类型,包括其大小:

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

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

我会考虑你是否甚至想要返回一个原始指针;你可能会考虑返回一个智能指针对象。

您的阵列大小计算存在缺陷;我不确定你在那里做什么。我希望allocSize实际上是元素大小,因此计算是:

allocSize = (allocSize * elementCount);

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