我正在使用某些库,并且想用以下类型定义私有实用程序头文件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 *
,这非常容易出错。
这样的“借来的指针”有意义吗?如果是这样,我将如何输入(如果可能的话)更安全