gpt4 book ai didi

c - getline函数返回值为-1时内存泄漏

转载 作者:行者123 更新时间:2023-11-30 16:51:14 32 4
gpt4 key购买 nike

#include <stdio.h>                              
int main(int argc, char** argv)
{
FILE *fp = NULL;
char* line = NULL;
ssize_t read = 0;
ssize_t len = 0;
fp = popen("lspci | grep aaaaaa", "r");

if((read = getline(&line, &len, fp)) == -1){
pclose(fp);
return -1;
}

pclose(fp);
}

这是测试程序。

我在这里写了功能测试代码。我想知道当函数 getline 返回 -1 时是否需要释放缓冲区。我在我的环境中测试了它。我发现当getline函数返回-1时,存在内存泄漏。以下是我的调试步骤:

Breakpoint 1, main (argc=1, argv=0xbffff754) at getline.c:8
8 FILE *fp = NULL;
(gdb) n
9 char* line = NULL;
(gdb)
10 ssize_t read = 0;
(gdb)
11 ssize_t len = 0;
(gdb)
12 fp = popen("lspci | grep aaaaaa", "r");
(gdb)
14 if((read = getline(&line, &len, fp)) == -1){
(gdb) i locals
fp = 0x804b008
line = 0x0
read = 0
len = 0
(gdb) n
15 pclose(fp);
(gdb) i locals
fp = 0x804b008
line = 0x804b0b8 ""
read = -1
len = 120

最佳答案

这是getline函数的第一期。另一个问题就在这里。我想知道getline函数是否使用realloc函数,并在缓冲区不够时释放缓冲区。下面是另一个测试代码。我得到的观点是 getline 函数用 128 字节初始化 malloc 内存。但当缓冲区不够时,它不会使用 realloc 函数来分配缓冲区。

以下测试代码分配 3 个缓冲区。 getline 函数缓冲区位于中间。初始化的 getline 缓冲区为 128 字节。然后我再次调用 getline 函数来获取超过 128 字节的缓冲区。我在 free 函数中设置了断点,但它没有被调用。

#include <stdio.h> 
#include <stdlib.h>
#include <string.h>

int main(int argc, char** argv)
{

char *buffer = NULL;
char *buffer1 = NULL;
char *buffer2 = NULL;
size_t bufsize = 32;
size_t characters;


buffer1 = (char *)malloc(bufsize * sizeof(char));
if( buffer1 == NULL)
{
perror("Unable to allocate buffer");
exit(1);
}

printf("buffer1 = 0x%p\n", buffer1);
printf("Type something: ");
characters = getline(&buffer,&bufsize,stdin);

printf(" get line buffer = 0x%p\n", buffer);
buffer2 = (char *)malloc(bufsize * sizeof(char));
if( buffer2 == NULL)
{
perror("Unable to allocate buffer");
exit(1);
}
memset(buffer2, 21,bufsize);

printf("buffer2 = 0x%p\n", buffer2);
printf("buffer2 content = %s\n", buffer2);
printf("%zu characters were read.\n",characters);
printf("You typed: '%s'\n",buffer);
printf("The address is = 0x%p\n", buffer);

characters = getline(&buffer,&bufsize,stdin);
printf("%zu characters were read.\n",characters);
printf("You typed: '%s'\n",buffer);
printf("The address is change = 0x%p\n", buffer);
free(buffer);
return(0);
}

调试过程:

Breakpoint 1, main (argc=1, argv=0xbffff754) at getline.c:22
22 char *buffer = NULL;
(gdb) n
23 char *buffer1 = NULL;
(gdb)
24 char *buffer2 = NULL;
(gdb)
25 size_t bufsize = 32;
(gdb)
29 buffer1 = (char *)malloc(bufsize * sizeof(char));
(gdb)
30 if( buffer1 == NULL)
(gdb)
36 printf("buffer1 = 0x%p\n", buffer1);
(gdb)
buffer1 = 0x0x804b008
38 printf("Type something: ");
(gdb)
39 characters = getline(&buffer,&bufsize,stdin);
(gdb)
Type something: aaaaaa
41 printf(" get line buffer = 0x%p\n", buffer);
(gdb)
get line buffer = 0x0x804b030
42 buffer2 = (char *)malloc(bufsize * sizeof(char));
(gdb) n
43 if( buffer2 == NULL)
(gdb) n
48 memset(buffer2, 21,bufsize);
(gdb) n
50 printf("buffer2 = 0x%p\n", buffer2);
(gdb) n
buffer2 = 0x0x804b0b0
52 printf("%zu characters were read.\n",characters);
(gdb) p 0xb0 -0x30
$1 = 128
(gdb) b free
Breakpoint 2 at 0xb7e8cc60: free. (2 locations)
(gdb) n
7 characters were read.
53 printf("You typed: '%s'\n",buffer);
(gdb) n
You typed: 'aaaaaa
'
54 printf("The address is = 0x%p\n", buffer);
(gdb) n
The address is = 0x0x804b030
56 characters = getline(&buffer,&bufsize,stdin);
(gdb)
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
57 printf("%zu characters were read.\n",characters);
(gdb) n
190 characters were read.
58 printf("You typed: '%s'\n",buffer);
(gdb)
You typed: 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
'
59 printf("The address is change = 0x%p\n", buffer);
(gdb)
The address is change = 0x0x804b130
60 free(buffer);
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x08048566 in main at getline.c:22
breakpoint already hit 1 time
2 breakpoint keep y <MULTIPLE>
2.1 y 0xb7e8cc60 in __GI___libc_free at malloc.c:2912
2.2 y 0xb7ff3730 in free at dl-minimal.c:119

关于c - getline函数返回值为-1时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41858864/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com