释放向量中的mallowed char*

Free up malloced char * in a vector?

本文关键字:char mallowed 向量 释放      更新时间:2023-10-16

我们得到了:

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);
}

现在使用后,我希望释放分配的内存。它会自行消失吗?或者我必须释放()所有元素?我试着这样叫免费:

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));"  

然后我用了一个演员阵容:

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

现在它似乎在运行,但我不确定它是否有效?看起来对吗?

[EDIT]
根据以下评论和答案。铸造它是可以的。另一种选择是使用delete(),如下所示:无法释放C中的常量指针(C的free有一个问题,在C++中的delete()中修复了这个问题)。

你所做的(我很确定)在技术上是允许的。然而,将malloc作为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>更有意义。这样,内存就会自动释放出来,因为容器的析构函数会处理它