释放向量中的 malloced char *?

Free up malloced char * in a vector?

我们得到:

typedef const char* V;
typedef std::vector<V> Record;

我们在代码中的某处实例化记录,例如:

Record rec;

我们通过 malloc 用数据填充它:

void fixed_len_read(void *buf, int size, Record *record){
    char *c_buf = (char *)malloc(size);
    memcpy(c_buf, buf, size);
    record->push_back(c_buf);
}

现在使用后,我想释放分配的内存。它会自己消失吗?还是我必须 free() 每个元素? 我试着像这样拨打免费电话:

for (int i =0; i < 100; i++) {
   free(record.at(i));
}

但它抱怨 const char。

    " error: no matching function for call to 'free'
    free(record.at(i));"  

然后我用了一个cast:

  for (int i =0; i < 100; i++) {
      free((char *) record.at(i));
  }

现在好像可以运行,但不知道行不行?这样看起来对吗?

[编辑]
根据下面的评论和答案。铸造它是确定的。另一种方法是按照以下方式使用 delete() : Unable to free const pointers in C (C 的 free 有一个问题,已在 c++ 的 delete() 中修复)。

你所做的(我很确定)在技术上是允许的。但是,malloc a const char* 确实没有任何意义,因为如果没有强制转换,您将无法在分配后初始化内存。

free 需要一个 void*,这就是为什么当你传递给它一个 const char* 时编译器会报错。 const 指针不能隐式转换为 void*。当你使用 (char*) 抛弃 constness 时,你使它可以转换,并且 free 可以使用变量。

要回答您的问题,是的,您确实需要在销毁 vector 之前释放每个元素。它不会自己发生。

说实话,你教授给你的代码完全是胡说八道。如果您谈论的是二进制数据,也许您应该使用 std::vector<std::vector<std::uint8_t>> 而不是 vector<const char*>。如果你真的持有字符串,std::vector<std::string> 更有意义。这样,内存会自动为您释放,因为容器的析构函数会处理它。