我的代码中有一个读取行,就像这样读取文件的内容
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.
}
谢谢, 苏尼
答案 0 :(得分:1)
缓冲区必须以与分配相同的方式一次性释放。你要求一个连续的内存块,它由前面的堆控制信息返回给你,描述缓冲区。如果你试图单独释放元素,那么堆管理器会感到困惑,并且过程会出错。
答案 1 :(得分:1)
不,没有办法做到这一点。只需将原始指针存储在某处,然后递增您正在使用的指针。完成后,您可以随意free
原始指针。
也就是说,如果您使用的是C ++,则不应该使用malloc
或free
,也不应该使用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。
答案 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]
}
}