我有一个将指针存储为数据的数据库。我想从数据库中提取此值并释放此值(指针)指向的内存位置。
但是编译器不允许我使用以下错误执行此操作:
错误:参数1的不兼容类型ג€〜freeג€™`
因为我确定我错误地释放了指针的值(但这正是我想要做的,因为这个值是一个指针)。
从数据库函数中删除值:
int ipv4_ifindex_remove (vrf_ipv4_key_t key)
{
int ret;
arp_adj_t *adjP;
ipv4_ifindex_get_ptr(key, &adjP);
ret = smallmap_remove(bcm_ipv4_map, &key, sizeof(key));
if (ret != MAP_OK)
{
ftr_trace_err("ipv4_ifindex_remove failed key: (%u:%x)",
key.vrf, key.ipv4);
}
free(*adjP); // <--- Compiler won't allow this
return (ret);
}
static void ipv4_ifindex_get_ptr(vrf_ipv4_key_t key, arp_adj_t **adjP)
{
int ret;
ret = smallmap_get(ipv4_map, &key, sizeof(key), (any_t *)adjP);
if (ret != MAP_OK)
{
ftr_trace_verbose("ipv4_ifindex_get: ifindex not found key: (%u:%x)",
key.vrf, key.ipv4);
CASSERT_MSG(0, "Failed to get data from smallmap");
}
}
为数据库添加值:
int ipv4_ifindex_put(vrf_ipv4_key_t key, arp_adj_t adj)
{
int ret;
arp_adj_t *adjP = (arp_adj_t *) calloc(1, sizeof(arp_adj_t));
if (adjP == NULL)
{
CASSERT_MSG(0, "uc_entry_add failed to calloc %d",
sizeof(arp_adj_t));
}
memcpy(adjP, &adj, sizeof(arp_adj_t));
ret = smallmap_put(bcm_ipv4_map, &key, sizeof(key), (any_t)(adjP));
if (ret != MAP_OK)
{
ftr_trace_err("bcmdb_ipv4_ifindex_put: failed key: (%u:%x)",
key.vrf, key.ipv4);
}
return (ret);
}
如何在没有编译器错误的情况下释放指针?
答案 0 :(得分:4)
将指针本身传递给free()
,而不是指针指向的值。指针指向什么并不重要。在这方面,(只要指针早先由内存分配器函数返回),指针对象的类型(?)无关紧要。
初看起来,将指针的地址传递给被调用函数(ipv4_ifindex_get_ptr(key, &adjP);
)可能会让您感到困惑,但这是因为内存分配是从被调用函数发生的。我们知道,函数参数是在C中使用call-by-value传递的,如果被调用函数负责分配内存并且调用者中的参数应该能够反映内存,那么你将需要一个指向类型的指针。
提供,内存分配器函数返回的指针存储在指针变量中,您只需将指针本身传递给free()
(并完成它)。< / p>