【发布时间】:2016-08-21 16:50:11
【问题描述】:
所以我正在制作一个内存堆栈分配器,它能够以连续的方式将任何类型的任何实例分配到堆上。
为了做到这一点,我在每个分配之前直接添加了一个“AllocationHeader”类,其中包含实例地址本身的 void* 和前一个标头的 AllocationHeader*。 到目前为止,这工作得很好,我能够分配和解除分配等。
但我遇到了 1 个(可能是 2 个)问题。 为了正确解除分配,我还需要调用相关对象的析构函数,然后将其从堆栈中删除。 当我删除一个我有一个指针的实例时这很好,因为我可以将它传递给 deallocate 函数并且它知道它是什么类型并做它的事情。
问题出在我想创建像 deallocateAll() 或 deallocateAllAboveObject(T* obj) 这样的函数时,因为我需要知道每个分配的类型而不显式传递它们的指针,所以我可以向下堆栈中的每个分配边走边调用每个的解构器。
我想要的是能够创建一个 AllocationHeader 来存储任何类型的指针,然后可以在以后不知道类型的情况下检索指针的类型。
我真的不确定如何执行此操作,因为到目前为止我看到的所有建议都涉及将对象与特定类型进行比较并查看它们是否相同。但是,我不能只检查程序中每个可能的类,因为我继续在此基础上构建可能有 1000 个。
或者,如果您对可以处理任何类型的堆栈分配器的替代方法有任何建议,那也很好。
任何帮助都将不胜感激。
【问题讨论】:
-
最好在这里发布您的代码而不是解释它
-
您必须将每个对象的类型信息存储在某处,要么与数据一起存储,要么存储在单独的容器中,如
std::map -
@gdlmx 到目前为止,我还没有任何与这个问题相关的代码,甚至在我尝试创建一些东西之前,我尝试了一些计划并且知道我会遇到这个问题。我所知道的是我需要一个包含指向任何可能对象的指针的类,然后我可以以某种方式找出类中指针的类型。
-
@gdlmx 如果我将 type_info 存储在其他地方,我该如何使用它呢?我已经想到了这种方法,但我认为它不起作用,因为虽然 type_info 包含类型的信息,但我不能使用它来(例如)将 void* 转换为 MyClass* 而不进行某种类型的比较我拥有的 type_info 和 MyClass type_info。这是对的还是我弄错了?
-
type_info 我的意思是特定类型/类的 constructor 和 destructor,如@Isaac 的答案所示。像
std::unordered_map<void *, std::pair<func_ptr, func_ptr>> allocator这样typedef void (*func_ptr)()和对分别存储构造函数和析构函数指针。然后你可以通过allocator[p].second(p);销毁对象
标签: c++ templates memory-management types allocator