我们得到了:
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*)
丢弃const
ness时,您使其可转换,并且free
可以接受该变量。
要回答您的问题,是的,您确实需要在vector
被销毁之前释放每个元素。它不会单独发生。
说实话,你的教授给你的代码完全是胡说八道。如果您谈论的是二进制数据,也许您应该使用std::vector<std::vector<std::uint8_t>>
而不是vector<const char*>
。如果你真的在牵线搭桥,std::vector<std::string>
更有意义。这样,内存就会自动释放出来,因为容器的析构函数会处理它