有没有办法按元素清除缓冲区元素?

时间:2010-08-25 01:28:07

标签: c++ free buffer

我的代码中有一个读取行,就像这样读取文件的内容

  fread(buffer,sizeof(char),1024,file1);

我知道我可以使用free(buffer);释放缓冲区,但我的问题是,有没有办法逐个删除缓冲区中的元素?说,我使用了第一个元素,我不再需要它,所以我想删除它。  可能会有这样的事情

for(i=0 ; i< 1024; i++){
   *do something with buffer[1] *
   free(buffer[1]); // I know this is wrong but something which can do the same.
 }

谢谢, 苏尼

5 个答案:

答案 0 :(得分:1)

缓冲区必须以与分配相同的方式一次性释放。你要求一个连续的内存块,它由前面的堆控制信息返回给你,描述缓冲区。如果你试图单独释放元素,那么堆管理器会感到困惑,并且过程会出错。

答案 1 :(得分:1)

不,没有办法做到这一点。只需将原始指针存储在某处,然后递增您正在使用的指针。完成后,您可以随意free原始指针。

也就是说,如果您使用的是C ++,则不应该使用mallocfree,也不应该使用fread ....

答案 2 :(得分:1)

如果要将分配/文件读取分解为较小的值,则可以执行此操作。就像史蒂夫说的那样,你只能释放你分配的完全相同的内存块。

更改现有代码的示例:

const size_t size_of_full_buffer = 1024;
const size_t size_of_buffer_chunk = 128; /* evenly divisible */
size_t size_read = 0;

while(size_read <= size_of_full_buffer)
{
  buffer = (char*) malloc(sizeof(char) * size_of_buffer_chunk)
  fread(buffer, sizeof(char), size_of_buffer_chunk, file1);

  for(i = 0; i < size_of_buffer_chunk; i++)
  {
      /* do something with buffer[1] */
  }

  free(buffer);
  size_read += size_of_buffer_chunk;
}

但是,您应该使用输入文件流而不是fread。如果文件流要求您分配缓冲区(它们可能不会)使用向量而不是malloc / free。

  • std :: fstream,std :: ifstream
  • 的std ::矢量

答案 3 :(得分:1)

您只能释放您分配的内容。你分配的是整个缓冲区,而不是缓冲区的各个元素。

来自N1256(我没有C99标准)

$ 7.20.3.2 / 2-“free函数导致ptr指向的空间被释放,即可用于进一步分配。如果ptr是空指针,则不执行任何操作。否则,如果该参数与之前由calloc,malloc或261)realloc函数返回的指针不匹配,或者如果通过调用free或realloc释放了空间,则行为未定义。

如果你正在考虑从缓冲区中删除不必要的元素,你必须自己做,如果你使用数组,或者你将不得不适应STL容器(矢量/列表)等(提供元素管理的接口)

答案 4 :(得分:0)

C ++ stl这样做的方法是

#include <fstream>
#include <cassert>
#include <vector>

void foo () {
   const char* myFilename = "some_file_path"; 
   std::ifstream myStream (myFilename);

   assert (myStream.is_open());

   int n = 1024;
   std::vector<char> buffer (n);
   myStream.read (&buffer[0], n);
   assert (myStream.good());

   for (int i = 0; i < n; i++) {
       char* myPtr = &buffer[i];
       //do something with buffer[i]
   }

}