C基本内存管理实现

问题描述 投票:-1回答:2

我正在尝试在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标准是否允许或建议我在做什么。基本上,我的代码...

c gcc memory-management
2个回答
0
投票

是的,这是一种有效的方法。 malloc()仅返回一个指针,它根本不了解类型,只知道内存块。


0
投票

要回答您的问题,如果可以按照C标准以合法方式这样做,那么可以。有可能。

© www.soinside.com 2019 - 2024. All rights reserved.