C++ 有没有办法逐个清除缓冲区元素?
我的代码中有一行fread,它可以像这样读取文件的内容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(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