Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 释放向量中的malloced char*?_C++_Memory Leaks_Malloc_Free - Fatal编程技术网

C++ 释放向量中的malloced char*?

C++ 释放向量中的malloced char*?,c++,memory-leaks,malloc,free,C++,Memory Leaks,Malloc,Free,我们得到: typedef const char* V; typedef std::vector<V> Record; 我们通过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); } 现

我们得到:

typedef const char* V;
typedef std::vector<V> Record;
我们通过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));
}
然后我用了一个石膏:

  for (int i =0; i < 100; i++) {
      free((char *) record.at(i));
  }
for(int i=0;i<100;i++){
自由((字符*)记录在(i));
}
现在它似乎在运行,但我不确定它是否有效?看起来对吗

[编辑]
根据下面的评论和回答。铸造它是好的。另一种方法是使用delete(),如下所示: (C的free有一个问题,在C++中的delete()中修复了这个问题。

您所做的(我很确定)在技术上是允许的。但是,使用
malloc
a
const char*
确实没有意义,因为如果没有强制转换,您将无法在分配后初始化内存

free
接受一个
void*
,这就是为什么当您向它传递一个
const char*
时编译器会抱怨的原因
const
指针不能隐式转换为
void*
。当您使用
(char*)
丢弃
常量
时,您可以使其可转换,并且
free
可以接受该变量

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


说实话,你的教授给你的密码完全是胡说八道。如果您谈论的是二进制数据,那么您可能应该使用
std::vector
,而不是
vector
。如果您真的持有字符串,
std::vector
更有意义。这样,内存就会自动释放,因为容器的析构函数会处理它。

每个人都是C/C++语言的新手。请用一个标签,很奇怪。他想让你学习如何编写容易出错且难以维护的代码,有什么特别的原因吗?找一位新教授。嗯。。。也许我们需要AssignmentReview.SE打开?谢谢你的回答。唯一的一件事,我们不需要一个常量字符。我们malloc一个char*?对,你malloc一个
char*
,但是几乎立刻通过把它推到向量中来分配它
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));
  }