以安全的方式借用指针

时间:2019-04-16 16:05:14

标签: c memory-management

我正在使用某些库,并且想用以下类型定义私有实用程序头文件util.h

/**
* The struct is used to indicate that deallocation function 
* for some object containing the struct util_borrowed_ptr
* as a subobject should not reclaim memory borrowed_ptr points to
*/
struct util_borrowed_ptr{
    void *ptr;
};

这是一种“标记类型”,可为客户端提供一些信息。否则,不清楚是否应该释放内存。目前,我有以下用例:

struct some_data{
    int a;
    int b;
};

struct lib_context{
    struct some_data *sd_ptr;
};

struct service{
    struct util_borrowed_ptr some_data_ptr;
};

struct service * create_from_context(struct lib_context *ctx_ptr){
    struct service *svc = malloc(sizeof *svc);
    struct util_borrowed_ptr some_data_ptr = {
        .ptr = ctx_ptr -> sd_ptr
    };
    svc -> some_data_ptr = some_data_ptr;
    return svc;
}

void release_service(struct service *svc){
    free(svc); //we do not reclaim memory
               //pointed to by borrowed_ptr
}

在这种情况下,struct service的客户很明显,由于它是从某个地方借来的,因此不必重新分配其字段。

问题在于它的类型为void *,所以我不得不将其来回转换为struct some_data *,这非常容易出错。

这样的“借来的指针”有意义吗?如果是这样,我将如何输入(如果可能的话)更安全

0 个答案:

没有答案