gpt4 book ai didi

c - 动态字符串的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 02:52:19 25 4
gpt4 key购买 nike

所以基本上我的输入是一个未知大小的字符串。我所做的是创建一个函数来扫描它并为每个字符动态分配内存。

char* GetUnknownStr(){
char* string = NULL;
char input = 0;
int charCount = 0;
//scan for chars until ENTER is pressed
while (input != '\n'){
scanf("%c", &input);
//on last iteration (when ENTER is pressed) break from loop
if (input == '\n')
break;
//realloc new amount of chars
string = (char*)realloc(string, (++charCount)*sizeof(char));
//check if realloc didnt fail
if (string == NULL){
puts("failed to allocate");
return 0;
}
//assign char scanned into string
string[charCount-1] = input;
}
//realloc 1 more char for '\0' in the end of string
string = (char*)realloc(string, (++charCount)*sizeof(char)); <--leak
string[charCount-1] = '\0';
return string;
}

VALGRIND:

==30911== HEAP SUMMARY:
==30911== in use at exit: 4 bytes in 1 blocks
==30911== total heap usage: 7 allocs, 6 frees, 16 bytes allocated
==30911==
==30911== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==30911== at 0x4A05255: realloc (vg_replace_malloc.c:476)
==30911== by 0x40091F: GetUnknownStr (in /u/stud/krukfel/C/e5/a.out)
==30911== by 0x40266B: main (in /u/stud/krukfel/C/e5/a.out)
==30911==
==30911== LEAK SUMMARY:
==30911== definitely lost: 4 bytes in 1 blocks
==30911== indirectly lost: 0 bytes in 0 blocks
==30911== possibly lost: 0 bytes in 0 blocks
==30911== still reachable: 0 bytes in 0 blocks
==30911== suppressed: 0 bytes in 0 blocks
==30911==
==30911== For counts of detected and suppressed errors, rerun with: -v
==30911== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 6 from 6)

由于某种原因,我遇到了内存泄漏,无法弄清楚原因,尝试使用 valgrind 但无法从中得到太多意义。谢谢!

最佳答案

除了小的风格问题,例如转换 malloc 和乘以 sizeof(char),您的代码没有问题。实际泄漏是在调用您的函数的代码中。

处理内存泄漏的一个核心问题是所有权问题。一旦知道谁拥有分配的内存块,就知道需要在何处释放它以避免泄漏。在这种情况下,字符串是在 GetUnknownStr 中创建的,但随后该字符串的所有权将转移给调用者。 GetUnknownStr 函数的调用者负责对函数返回的结果调用 free。如果调用者不释放字符串,就会报告泄漏。泄漏的位置将是最后一次重新分配的点,即您在代码中标记的行。

关于c - 动态字符串的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20933959/

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