我正在编写一个简单的内存管理器。我正在尝试简化此功能,以便其他人可以 只需添加他们想要分配的对象作为第一个参数。内存管理器将 为该对象分配空间,并设置对象的指针指向分配的空间 空间。问题是我不确定如何将参数设置为任何类型 可以传入对象的数量,而不必为了让它工作而疯狂地转换它。
函数如下:
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);
任何帮助或指导将不胜感激! :)
最佳答案
使用模板和重载,可以直接对data
的类型进行操作,包括它的大小:
template<typename T>
bool MemoryManager::Allocate(T*& data)
{
size_t allocSize = sizeof(T);
...
}
不过,当谈到数组时,通常我们会尽量避开 C++ 中的指针。使用 vector<T>
例如。您可以指定自己的分配器。
我会考虑你是否真的想返回一个原始指针;您可能会考虑返回一个智能指针对象。
您的数组大小计算有缺陷;我不太确定你想在那里做什么。我希望 allocSize
实际上是元素大小,因此计算是:
allocSize = (allocSize * elementCount);
但是您无法知道用户请求了多少元素。
关于c++ - 通过 void 指针将对象传递给函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012531/