我们得到了:
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()中修复了。)
答案 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>
更有意义。这样,内存自动为您自由,因为容器的析构函数可以处理它。