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/