c - for循环中的内存泄漏

标签 c memory-leaks for-loop 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;
}

当我运行 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/

相关文章:

c - 如何调用指向 typedef 结构中定义的函数的指针

c - while (n > 1) 比 while (n) 快 25%?

c++ - 即使我不执行动态分配,Valgrind 也会报告映射中的内存泄漏

ios - iPad 中调用者此时不拥有的对象的引用计数的不正确减少

Java - 在单词末尾结束 for 循环

c - 为什么 fgets 在程序关闭和从 tail -f 传输数据时挂起?

c - 无需组装即可检测CPU能力

java - 管理流使用期间的内存使用情况

for 循环中的 C# 数组产生相同的随机整数值

javascript - 在 for 循环中设置一个标志,以便在同一循环内调用的函数的回调函数中使用