gpt4 book ai didi

c - for循环中的内存泄漏

转载 作者:太空宇宙 更新时间:2023-11-04 05:20:53 25 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 无效的错误。

我假设这与我的 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 中遇到错误。我是否更新不正确?

最佳答案

这几乎可以肯定是因为您超出了数组的末尾。 k的最大值是MAXRECORDS-1而你正在使用 k+1在你的表达中。

这意味着您将访问 array[MAXRECORDS]其中索引应限制在 0 之间和 MAXRECORDS - 1包容性。

在没有更多上下文的情况下很难看出您正在尝试做什么,但修复可能就像使用 k < MAXRECORDS - 1 一样简单作为for循环继续条件(中间的位):

for (k = i; k < MAXRECORDS - 1; k++) {

其他 可能性是 i 的无效值, 比如 -1例如,这会在数组的另一端引起问题。这可能不太可能,因为我假设您正在删除元素 i通过将所有其他元素向下移动(如:i 将被设置为有效索引)。


顺便说一句,这不是内存泄漏,只是内存损坏。内存泄漏是指当您分配内存然后丢失指向它们的指针时,它们将永远无法释放,例如:

char *x;
for (i = 0; i < 10; i++)
x = malloc (64);

只有最后分配是可访问的。


顺便说一句,如果您要进行改组删除,那么(在我看来)最好这样做:

// For every element where there's a non-NULL next element,
// shift that element down. Then force the last element to
// be NULL (it will have been shifted down already).

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

额外条件在下一个元素为 NULL 时停止,并将 NULL 放入该位置。这应该可以正常工作,并且具有不那么复杂的优点。

关于c - for循环中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8950651/

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