无法释放指针(保存指针)的值

问题描述 投票:-1回答:1

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

但是编译器不允许我使用以下错误执行此操作:

错误:参数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);
}

如何在没有编译器错误的情况下释放指针?

c pointers free
1个回答
4
投票

您将指针本身传递给free(),而不是指针指向的值。指针指向什么并不重要。在这方面,(只要指针早先由内存分配器函数返回),指针对象(?)的类型无关紧要。

初看起来,将指针的地址传递给被调用的函数(ipv4_ifindex_get_ptr(key, &adjP);)可能会让人感到困惑,但这是因为,内存分配是从被调用函数发生的。我们知道,函数参数是在C中使用call-by-value传递的,如果被调用的函数负责分配内存并且调用者中的参数应该能够反映内存,那么你需要一个指针指向 - 那种类型。

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

© www.soinside.com 2019 - 2024. All rights reserved.