gpt4 book ai didi

c - 是什么导致此 for 循环中的内存泄漏?

转载 作者:太空宇宙 更新时间:2023-11-04 07:36:00 26 4
gpt4 key购买 nike

for(k=i; k<MAXRECORDS; k++) {
if(slist->servers_ptr[k+1] != NULL) {
slist->servers_ptr[k] = slist->servers_ptr[k+1];
} else slist->servers_ptr[k] = NULL;
}

当我运行 valgrind 时,出现大小 8 无效的错误。

注意 MAXRECORDS = 10,数组大小为 MAXRECORDS

我假设这与我的 for 循环中的边界大小写有关,但我不明白它是如何发生的。

编辑:有人指出,在 for 循环的最后一轮,访问 servers_ptr[k+1] 是在数组之外,导致 valgrind 错误。我已经将我的代码更新为:

for(k=i; k<MAXRECORDS-1; k++) {
if(slist->servers_ptr[k+1] != NULL) {
slist->servers_ptr[k] = slist->servers_ptr[k+1];
if(k==MAXRECORDS-2)slist->servers_ptr[k+1] = NULL;
} else slist->servers_ptr[k] = NULL;
}

我仍然在 valgrind 中遇到错误。我是否更新不正确?

最佳答案

servers_ptr 的大小为 MAXRECORDS。在 for 循环的最后一次迭代中,k == MAX_RECORDS - 1。您访问 servers_ptr[k+1],这将是 servers_ptr[MAX_RECORDS],这是数组末尾之后的一个。这是未定义的行为,valgrind 会标记它。

            for(k=i; k<MAXRECORDS; k++) {
if(slist->servers_ptr[k+1] != NULL) {
slist->servers_ptr[k] = slist->servers_ptr[k+1];
} else slist->servers_ptr[k] = NULL;
}

考虑 else 子句。它与:

slist->servers_ptr[k] = slist->servers_ptr[k+1];

因为我们知道 slist->server_ptr[k+1] 是 NULL 因为我们没有通过 if 条件。但这意味着 if 的两个分支是相同的。所以代码等同于:

            for(k=i; k<MAXRECORDS; k++) {
slist->servers_ptr[k] = slist->servers_ptr[k+1];
}

所以你所做的就是像这样将所有指针向左移动:

[1][2][3][4][5]
[2][3][4][5][?]

您的代码试图将一个值转换为多个值,但最终从某处提取垃圾。

解决方案是少复制一个项目并将最后一个单元格作为特殊情况处理。

            for(k=i; k<MAXRECORDS-1; k++) {
slist->servers_ptr[k] = slist->servers_ptr[k+1];
}
slist->servers_ptr[MAXRECORDS-1] = NULL;

关于c - 是什么导致此 for 循环中的内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8954004/

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