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