如何释放在开始时已重新分配并随后重新分配和重新分配的内存?这个ptr是我的尝试,但是valgrind说有6个分配和6个释放,但是3个块中有90个字节肯定丢失了。
char *textInFile = (char *) calloc(currentLength + 1, sizeof(char) * currentLength);
char *currentLine = (char *) calloc(currentLength + 1, sizeof(char) * currentLineLength);
...
while ((textInFile[index] = getc(f)) != EOF) {
if (index > currentLength - 3) {
currentLength += 10;
ptr = textInFile;
textInFile = (char *) realloc(textInFile, currentLength);
textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
free(ptr);
}
...
if (textInFile[index] == '\n') {
int k = 0;
for (int i = previousIndex; i < index; i++) {
if (k > currentLineLength - 3) {
currentLineLength += 10;
ptr = currentLine;
currentLine = (char *) realloc(currentLine, currentLineLength);
currentLine = (char *) calloc(currentLineLength, sizeof(char) * currentLineLength);
free(ptr);
}
...
index++;
}
...
free(textInFile);
free(currentLine);
== 4426 ==堆摘要:
== 4426 ==在出口处使用:3个块中的90个字节
== 4426 ==总堆使用量:9个分配,9个空闲,14,668个字节分配
== 4426 ==
== 4426 ==泄漏摘要:
== 4426 ==绝对丢失:3个块中的90个字节
== 4426 ==间接丢失:0个字节(0块)
== 4426 ==可能丢失:0字节,共0个块
== 4426 ==仍可到达:0字节,0块
== 4426 ==已抑制:0个字节,共0个块
您需要调用free()
所返回的每个非NULL指针calloc()
。如果调用realloc()
,则不应调用free()
作为参数传递给的指针realloc()
,而应调用返回free()
的指针realloc()
。(注意:realloc()
正确使用是棘手的,特别是如果您想正确处理错误时,除非绝对必要,否则我建议避免使用它)
特别是您的代码的一个问题是:
textInFile = (char *) realloc(textInFile, currentLength);
textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
在第二行中,您textInFile
使用所返回的指针覆盖了的指针calloc()
,从而失去了对所返回的旧值的访问权限realloc()
,因此您无法释放该缓冲区。因此,您有内存泄漏。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句