Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.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++ 有没有办法逐个清除缓冲区元素?_C++_Free_Buffer - Fatal编程技术网

C++ 有没有办法逐个清除缓冲区元素?

C++ 有没有办法逐个清除缓冲区元素?,c++,free,buffer,C++,Free,Buffer,我的代码中有一行fread,它可以像这样读取文件的内容 fread(buffer,sizeof(char),1024,file1); 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. } 我知道我可以使用free(缓冲区)释放缓冲区但我的问题是,有没有一

我的代码中有一行fread,它可以像这样读取文件的内容

  fread(buffer,sizeof(char),1024,file1);
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.
 }
我知道我可以使用
free(缓冲区)释放缓冲区但我的问题是,有没有一种方法可以逐个删除缓冲区中的元素?。比如说,我使用了第一个元素,我不再需要它,所以我想删除它。
像这样的东西

  fread(buffer,sizeof(char),1024,file1);
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.
 }
(i=0;i<1024;i++)的
{
*使用缓冲区[1]执行某些操作*
空闲(缓冲区[1]);//我知道这是错误的,但有些东西也可以这样做。
}
谢谢,
sunil

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

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

不,没有办法做到这一点。只需将原始指针存储在某个位置,然后递增正在使用的指针。完成后,您可以自由地
释放
原始指针


< P > >如果使用C++,则不应使用<代码> Malc C <代码>或<代码>免费> />代码,也不应使用<代码> FRAD …p> 不,没有办法做到这一点。只需将原始指针存储在某个位置,然后递增正在使用的指针。完成后,您可以自由地
释放
原始指针


< P > >如果使用C++,则不应使用<代码> Malc C <代码>或<代码>免费> />代码,也不应使用<代码> FRAD …p> 如果您想将分配/读取的文件分解为更小的值,您可以这样做。不过,正如Steve所说,您只能释放与分配的内存块完全相同的内存块

更改现有代码的示例如下:

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;
}
const size\u t size\u/u full\u buffer=1024;
缓冲区块的常量大小大小=128;/*均匀可除*/
大小\u t大小\u读取=0;

while(size_read如果您想将分配/文件读取分解为更小的值,您可以这样做。不过,正如Steve所说,您只能释放与分配的内存块完全相同的内存块

更改现有代码的示例如下:

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;
}
const size\u t size\u/u full\u buffer=1024;
常量大小\u t大小\u缓冲块的大小\u=128;/*可均匀整除*/
大小\u t大小\u读取=0;

while(size_read您只能释放您分配的内容。您分配的是整个缓冲区,而不是缓冲区的单个元素

从N256开始(我没有C99标准)

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


但是,如果您正在考虑从缓冲区中删除不必要的元素,则如果您使用数组,则必须自己执行,或者必须适应STL容器(向量/列表)等(为元素管理提供接口)

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

从N256开始(我没有C99标准)

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


如果你正在考虑从缓冲区读取不必要的元素,那么你必须自己做,如果你使用数组,或者你必须要适应STL容器(向量/列表)等(它提供元素管理接口)

< P>一个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]
   }

}
#包括
#包括
#包括
void foo(){
const char*myFilename=“一些文件路径”;
std::ifstream myStream(myFilename);
断言(myStream.is_open());
int n=1024;
std::向量缓冲区(n);
myStream.read(和缓冲区[0],n);
断言(myStream.good());
对于(int i=0;i< /代码> 

一个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]
   }

}
#包括
#包括
#包括
void foo(){
const char*myFilename=“一些文件路径”;
std::ifstream myStream(myFilename);
断言(myStream.is_open());
int n=1024;
std::向量缓冲区(n);
myStream.read(和缓冲区[0],n);
断言(myStream.good());
对于(int i=0;i<代码> >我可以知道为什么和什么会推荐使用这些吗?@ SunIL是C的方式来做正确的方式在C++中引用这里也不是MALOC和免费使用新分配和删除内存分配。@ AijjHav+@ Sunil:你通常应该使用STD::在需要动态的情况下的向量分配缓冲区,而不是手动管理C++中的内存。在C语言中,这很好。哦,我真的很希望人们在投票前/投票后留下奇怪的评论:(即使我没有投票。是的,我同意我们应该使用向量。我能知道为什么,你建议用什么来代替这些吗?@Sunil t