如何释放曾经在乞讨中被释放过的记忆,然后再重新分配和再分配呢?这个ptr是我的尝试,但val差尔说,已经有6个分配和6个自由,但有90个字节,在3个块肯定丢失。
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个空闲,14668字节分配
==4426==
==4426==泄漏摘要:
==4426==绝对丢失:3个块中的90个字节
==4426==间接丢失:0块中的0字节
==4426==可能丢失:0块中的0字节
==4426==仍然可以到达:0块中的0字节
==4426==被抑制:0块中的0字节
发布于 2019-11-21 17:21:10
您需要对每个由free()返回的非空指针调用calloc()。如果调用realloc(),则不应该对作为参数传递给realloc()的指针调用free(),但应该对realloc()返回的指针调用free()。(注意:正确地使用realloc()是很棘手的,特别是如果您想正确地处理错误-我建议您避免它,除非它是绝对必要的)
尤其是代码中的一个问题是:
textInFile = (char *) realloc(textInFile, currentLength);
textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);在第二行中,您用textInFile返回的指针覆盖calloc()的指针,从而失去了对realloc()返回的旧值的任何访问,因此无法释放该缓冲区;因此出现内存泄漏。
发布于 2019-11-21 17:19:47
我想..。你误解了realloc。
realloc不是free。
它返回分配内存..。
你的代码
textInFile = (char *) realloc(textInFile, currentLength);
textInFile = (char *) calloc(currentLength, sizeof(char) * currentLength);
free(ptr);textInFile被分配了两次。第一个指针泄露了..。
发布于 2019-11-21 17:42:22
答案:
ptr应该指向本应被释放的realloc。在这个问题上,自从textInFile被覆盖后,它的原始入口就丢失了。
ptr = (char *) realloc(currentLine, currentLineLength);
currentLine = (char *) calloc(currentLineLength, sizeof(char) * currentLineLength);
free(ptr);https://stackoverflow.com/questions/58980353
复制相似问题