Заимствование указателей безопасным способом - PullRequest
0 голосов
/ 16 апреля 2019

Я работаю над некоторой библиотекой и хотел бы определить заголовок приватной утилиты 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 *, что чрезвычайно подвержено ошибкам.

Имеет ли такой "заимствованный указатель" смысл? Если да, то как бы я сделал это безопаснее (если это возможно)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...