在向量中释放malloced char *?

时间:2015-11-10 03:05:32

标签: c++ memory-leaks malloc free

我们得到了:

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

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

[编辑]
根据下面的评论和答案。施放它没关系。另一种方法是使用delete(): Unable to free const pointers in C (C&free是有问题的,在c ++中的delete()中修复了。)

1 个答案:

答案 0 :(得分:1)

你在做什么(我很确定)在技术上是允许的。但是,对malloc const char*来说真的没有意义,因为在没有强制转换的情况下,你无法在分配后初始化内存。

free需要void*,这就是编译器在您传递const char*时抱怨的原因。 const指针不能隐式转换为void*。当您使用const丢弃(char*)时,可以使其可转换,free可以使用变量。

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

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