内存泄漏/未正确释放。怎么修?
Memory leak / not properly freeing. How to fix?
我在一个函数中将部分输入读入缓冲区,然后在 main() 中释放它,但它似乎不起作用。我的代码:
char *save_to_buff()
{
int fd = 0; // set read() to read from STDIN_FILENO, because it's number is 0
const size_t read_size = 100; // set chunk size
size_t size = read_size;
char *buff = malloc(size+1);
size_t offset = 0;
size_t res = 0;
while((res = read(fd, buff + offset, read_size)) > 0) // partial read from stdin and save to buff
{
if(res == -1) // check for read errors
{
read_error();
free(buff);
return NULL;
}
offset += res;
if (offset + read_size > size)
{
size *= 2;
buff = realloc(buff, size+1);
}
buff[offset] = '[=10=]';
}
return buff;
}
主要内容:
char *buff = save_to_buff();
// do sth
free(buff);
编辑:只是尝试读取 1 字节而不是部分读取,没有内存泄漏。
您没有 post main()
函数的完整代码,可能存在我们没有看到的可疑之处。
函数 save_to_buff
有一些问题:
- 如果
stdin
在启动时已经在文件末尾,它将return一个指向101
字节的未初始化块的指针。它应该 return 空指针或指向空字符串的指针。
- 你没有测试内存分配失败
只要不修改 // do sth
部分中的 buff
,代码片段中的调用顺序似乎没问题。
这是修改后的版本:
#include <stdio.h>
#include <unistd.h>
char *save_to_buff() {
int fd = 0; // set read() to read from STDIN_FILENO
const size_t read_size = 100; // set chunk size
size_t size = read_size;
size_t offset = 0;
size_t res = 0;
char *buff = malloc(size + 1);
if (buff == NULL)
return NULL;
*buff = '[=10=]';
while ((res = read(fd, buff + offset, read_size)) != 0) {
// partial read from stdin and save to buff
if (res == (size_t)-1) { // check for read errors
read_error();
free(buff);
return NULL;
}
offset += res;
buff[offset] = '[=10=]';
if (offset + read_size > size) {
char *buff0;
size *= 2;
buff = realloc(buff0 = buff, size + 1);
if (buff == NULL) {
free(buff0);
return NULL;
}
}
}
return buff;
}
根据 this answer to a post,仍然可以访问 不一定表示内存泄漏。
我在一个函数中将部分输入读入缓冲区,然后在 main() 中释放它,但它似乎不起作用。我的代码:
char *save_to_buff()
{
int fd = 0; // set read() to read from STDIN_FILENO, because it's number is 0
const size_t read_size = 100; // set chunk size
size_t size = read_size;
char *buff = malloc(size+1);
size_t offset = 0;
size_t res = 0;
while((res = read(fd, buff + offset, read_size)) > 0) // partial read from stdin and save to buff
{
if(res == -1) // check for read errors
{
read_error();
free(buff);
return NULL;
}
offset += res;
if (offset + read_size > size)
{
size *= 2;
buff = realloc(buff, size+1);
}
buff[offset] = '[=10=]';
}
return buff;
}
主要内容:
char *buff = save_to_buff();
// do sth
free(buff);
编辑:只是尝试读取 1 字节而不是部分读取,没有内存泄漏。
您没有 post main()
函数的完整代码,可能存在我们没有看到的可疑之处。
函数 save_to_buff
有一些问题:
- 如果
stdin
在启动时已经在文件末尾,它将return一个指向101
字节的未初始化块的指针。它应该 return 空指针或指向空字符串的指针。 - 你没有测试内存分配失败
只要不修改 // do sth
部分中的 buff
,代码片段中的调用顺序似乎没问题。
这是修改后的版本:
#include <stdio.h>
#include <unistd.h>
char *save_to_buff() {
int fd = 0; // set read() to read from STDIN_FILENO
const size_t read_size = 100; // set chunk size
size_t size = read_size;
size_t offset = 0;
size_t res = 0;
char *buff = malloc(size + 1);
if (buff == NULL)
return NULL;
*buff = '[=10=]';
while ((res = read(fd, buff + offset, read_size)) != 0) {
// partial read from stdin and save to buff
if (res == (size_t)-1) { // check for read errors
read_error();
free(buff);
return NULL;
}
offset += res;
buff[offset] = '[=10=]';
if (offset + read_size > size) {
char *buff0;
size *= 2;
buff = realloc(buff0 = buff, size + 1);
if (buff == NULL) {
free(buff0);
return NULL;
}
}
}
return buff;
}
根据 this answer to a post,仍然可以访问 不一定表示内存泄漏。