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