在跨平台库中使用内存管理功能

时间:2012-09-24 08:46:59

标签: c memory-management cross-platform

我正在使用C创建一个跨平台库。我有一段代码,如下所示,我直接使用libc内存管理功能:

myObject* myObjectCreate(void)
{
    ...
    myObject *pObject = (myObject*)malloc(sizeof(*pObject));
    ...
}

void myObjectDestroy(myObject *pObject)
{
    ...
    free(pObject);
    ...
}

据我所知,这些内存管理功能并不总是可用,特别是在基于低端微控制器的嵌入式系统上。不幸的是,我的库需要在这些系统上进行编译。

要解决这个问题,我想我必须让我的库客户端自定义这些功能。

那么,推荐的方法是什么?

3 个答案:

答案 0 :(得分:2)

有很多方法。

我使用#if,结合编译器提供的定义,来实现每个平台的行为。

如果找到给定的功能(例如malloc),可以定义#define MYLIB_MALLOC。

然后,稍后,您可以检查#ifdef MYLIB_MALLOC,如果不存在,则提供一个虚拟malloc函数,它将允许您的代码进行编译。

答案 1 :(得分:1)

使用函数指针。

在库中定义以下指针:

void* (*CustomMalloc)(size_t) = NULL;
void (*CustomFree)(void*) = NULL;

在使用库函数之前,初始化这些指针以指向malloc()free()的自定义实现。或者将它们初始化为指向真实的malloc()free()

在库内部,将malloc(size)替换为CustomMalloc(size),将free(pointer)替换为CustomFree(pointer)

答案 2 :(得分:0)

使用条件编译,即定义一些宏,如LIBC_AVAILLIBC_NOT_AVAIL,并在编译时包含不同的代码。