gpt4 book ai didi

c - strdup() 即使在 free() 之后内存泄漏

转载 作者:太空狗 更新时间:2023-10-29 17:16:06 27 4
gpt4 key购买 nike

直到最近我才需要将 strdup(stringp)strsep(&stringp_copy, token) 一起使用,我认为这会导致内存泄漏。

(strdup() 之前总是free就好了。)

我修复了漏洞,我想我明白怎么做了,但我就是想不通为什么我需要这样做。

原始代码(摘要):

const char *message = "From: username\nMessage: basic message\n";
char *message_copy, *line, *field_name;
int colon_position;
message_copy = strdup(message);

while(line = strsep(&message_copy, "\n")) {
printf(line);
char *colon = strchr(line, ':');
if (colon != NULL) {
colon_position = colon - line;
strncpy(field_name, line, colon_position);
printf("%s\n", field_name);
}
}

free(message_copy);

不会泄露的新代码:

const char *message = "From: username\nMessage: basic message\n";
char *message_copy, *freeable_message_copy, *line, *field_name;
int colon_position;
freeable_message_copy = message_copy = strdup(message);

while(line = strsep(&message_copy, "\n")) {
printf(line);
char *colon = strchr(line, ':');
if (colon != NULL) {
colon_position = colon - line;
strncpy(field_name, line, colon_position);
printf("%s\n", field_name);
}
}

free(freeable_message_copy);

第一个代码中的message_copy 指针是如何被覆盖的?还是?

最佳答案

函数 strsep() 接受一个指向原始字符串 (message_copy) 的指针并修改它以返回一个指向“下一个”标记的新指针

const char *message = "From: username\nMessage: basic message\n";
char *message_copy, *original_copy;
//here you have allocated new memory, a duplicate of message
message_copy = original_copy = strdup(message);

在这里打印指针,

printf("copy %p, original %p\n", message_copy, original_copy);

请注意,当您使用 strsep() 时,您正在修改 message_copy,

char* token;
//here you modify message_copy
while(token = strsep(&message_copy, "\n")) {
printf("%s\n", token);
}

这说明了更改后的 message_copy,而 original_copy 没有变化,

printf("copy %p, original %p\n", message_copy, original_copy);

因为 message_copy 没有指向原始的 strdup() 结果,所以这是错误的,

free(message_copy);

但是保留原始的 strdup() 结果,这个免费的作品

//original_copy points to the results of strdup
free(original_copy);

关于c - strdup() 即使在 free() 之后内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21000218/

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