gpt4 book ai didi

c - 无法释放指针的值(持有指针)

转载 作者:行者123 更新时间:2023-11-30 18:28:20 24 4
gpt4 key购买 nike

我有一个将指针存储为数据的数据库。我想从数据库中取出这个值并释放这个值(指针)指向的内存位置。

但是编译器不允许我这样做,并出现以下错误:

error: incompatible type for argument 1 of ג€˜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);
}

如何释放指针而不出现编译器错误?

最佳答案

您将指针本身传递给free(),而不是指针指向的值。指针指向什么并不重要。在这方面,(只要该指针之前由内存分配器函数返回),指针接收者的类型()并不重要。

乍一看,您将指针的地址传递给被调用函数(ipv4_ifindex_get_ptr(key, &adjP);)似乎令人困惑,但这是因为内存分配发生了来自被调用的函数。众所周知,在 C 中函数参数是使用按值调用传递的,如果被调用函数负责分配内存并且调用者中的参数应该能够反射(reflect)内存,那么您将需要一个 指向该类型的指针。

假设内存分配器函数返回的指针存储在指针变量中,您只需将指针本身传递给free()(并完成它)。

关于c - 无法释放指针的值(持有指针),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47874024/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com