Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 跨平台库中内存管理功能的使用_C_Memory Management_Cross Platform - Fatal编程技术网

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

C 跨平台库中内存管理功能的使用,c,memory-management,cross-platform,C,Memory Management,Cross Platform,我正在使用C创建一个跨平台库。我有一段代码,如下所示,其中我直接使用libc内存管理函数: myObject* myObjectCreate(void) { ... myObject *pObject = (myObject*)malloc(sizeof(*pObject)); ... } void myObjectDestroy(myObject *pObject) { ... free(pObject); ... } 我知道这些内存管理功能

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

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

void myObjectDestroy(myObject *pObject)
{
    ...
    free(pObject);
    ...
}
我知道这些内存管理功能并不总是可用的,尤其是在基于低端微控制器的嵌入式系统上。不幸的是,我的库需要在这些系统上进行编译

为了解决这个问题,我想我必须让我的库客户端自定义这些函数


那么,实现这一目标的推荐方法是什么呢?

有很多方法

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

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


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

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

使用函数指针

在库中定义以下指针:

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


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

——需要有一种机制让代码知道是指向malloc()还是伪malloc()。函数指针的使用并不能解决这个问题。@BlankXavier我不确定我在这里看到了一个问题。你能详细说明一下吗?