我正在尝试在GCC环境中向C库项目编写基本的内存管理系统,然后来到这里询问C标准是否允许或建议执行我的操作。
基本上,我的代码库很大,并且在代码内部包含许多必需的和不需要的malloc操作。并不是说我很粗心地将malloc放在我想要的任何地方,但是直到项目快要结束时,我才知道需要哪些值的信息。
基本上,我的计划是创建一个在翻译单元之间共享的global参考计数器。并编写一个malloc包装器,该包装器将递增并添加到此引用计数中,并将指针存储在其中。因此剩下的就是在运行时间结束时以循环的形式释放所有引用。我在运行时结束时就激活了它,因此参考寿命并不是我要跟踪的问题,因此在某种程度上使问题变得更容易。
我还需要问这个重要问题。我在代码中有很多类型的指针。因此,当引用计数时,我必须将它们存储为void*
,这会导致未定义的行为并引起问题吗?
Edit:
These
值存储为void*
是用malloc分配的常规指针(可以是char *,int *,struct *等...),并在码。但是,鉴于引用计数器将不知道这些类型,因此我计划将它们保留在void*
的列表中。关于操作系统清理的建议,不幸的是,我创建的是大型库而不是可执行文件,因此,即使我的代码结束运行,我也应该释放内存,以便库用户不会遇到问题(用户的代码调用库函数后没有结束,这就是为什么我不能依赖操作系统清理的原因]
Edit2:
让我们创建一个我打算做的小例子。int ref_count = 0; void* ref_list[64]; // 64 is arbitrary. void* mallocWrapper(size_t size){ void* result = malloc(size); ref_list[ref_count] = result; ref_count += 1; return result; }
然后使用此列表释放代码中所有已分配的内存。
我正在尝试在GCC环境中为C库项目编写基本的内存管理系统,然后来到这里询问C标准是否允许或建议我在做什么。基本上,我的代码...
是的,这是一种有效的方法。 malloc()
仅返回一个指针,它根本不了解类型,只知道内存块。
要回答您的问题,如果可以按照C标准以合法方式这样做,那么可以。有可能。